A:天软中,证券代码一般由市场代码+数字证券代码组合而成,如"SZ000001",其中SZ表示深交所。
而在其它平台中,可能有不同的代码编制规则,比如"000001.SZ"这种方式。
用户在多平台数据进行交互处理时,则需要进行相应的转换。
一般常见的,当确定证券代码长度及格式时,可以简单地如下这种快速处理:
//SZ000001->000001.SZ
stock:="SZ000001";
return stock[3:]$"."$stock[1:2];
//000001.SZ->SZ000001
stock:="000001.SZ";
return stock[8:9]$stock[1:6];
但当需要批量操作,且市场代码长度不一,数字代码长度不一时,则可能上面这种方式就不大好处理。
因此,本文中封装了一个字符串拆分再重组的实现,供需要的用户参考使用。
调用前,先封装下面两个模型:
Function _RestCode(stock,formarstr); //字符串重组
begin
{tock:证券代码,
formarstr:重组后的格式,通过原始串的位置组成,原始串按连续字母、连续数字、连续符号进行分离
位置从左到右,从0开始
比如'10',即比如将"abc123"转成"123abc"
比如'1.0',即比如将"abc123"转成"123.abc",不支持中文符号
比如'20',即比如将"123.abc"转成"abc123"
比如'210',即比如将"abc123AAA"转成"AAA123abc"
}
lenS:=length(formarstr);
rS:='';
_stock:=DECstockCode(stock);
for i:=1 to lenS do
begin
if TryStrToInt(formarstr[i],v) then
begin
if ifstring(_stock[v]) then rS+=_stock[v];
end
else rS+=formarstr[i];//如果此时格式不为数字则直接拼接
end;
return rS;
end
Function DECstockCode(stock); //分解证券代码:字母、数字、符号
begin
stock:=trim(stock);
s:='([A-Z]{1,2})([0-9]+)';
s:='[A-Za-z]+|\\d+|.';
if ParseRegExpr(s,stock,"",r,mp,ml) then
begin
return r[:,0];
end
return array();
end
调用示例如下:
//批量转换 由AB->B.A
stocks:=array("SH600000","AP2606","HK00001","CSI000001");
stocks::=_RestCode(mcell,"1.0");
return stocks;
return _RestCode("HK00001","1.0");//HK00001->00001.HK
return _RestCode("000001.SZ","20");//000001.SZ->SZ000001
return _RestCode("SZ000001","1.0");//SZ000001->000001.SZ
//000001.SZ->SZ000001
stock:="000001.SZ";
return stock[7:8]$stock[1:6];
注:这两模型除了能处理这类代码格式转换问题,也支持类似字符串重组问题。