FAQ > 金融建模 > 建模问题 > 其他

Q:字符串重组之证券代码的格式转换    

  • 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];



    注:这两模型除了能处理这类代码格式转换问题,也支持类似字符串重组问题。