比如某数据1111111111111111 张三 2197.50 
2222222222222222 李四 2379.00 其中卡号为12位或16位,姓名为中文或E文,但是排列的顺序有时是姓名卡号金额,有时是卡号姓名金额,一共有6种可能,现在求一个聪明的算法

解决方案 »

  1.   

    一般姓名都不会是数字开头,而卡号好像都是数字吧,金额有小数点,而且长度小于12位,是以空格为单位分隔的吧,所以用POSEXgo 来查找出来比下就行了!
      

  2.   


    1111111111111111 张三 2197.50 
    2222222222222222 李四 2379.00 
    看你数据的格式,这样可以判断不:
    金额判断:判断是不是有小数点. pos();
    卡号判断:先判断为数字,且不含小数点,然后length(字符串):=12 or 16 (由于金额的话长度一般不会为这么大了,且你的金额是包含小数点的)
    名字判断: 剩下的就是这个字段了。
    不知这样可行不?
      

  3.   

    var
      str: string;
      i,c: integer;
    begin
      c:= length(str);
      Case c of
        0..11: begin
                 for i:=1 to c do
                   if str[i] not in [0..9] then ...
                     else ...
               end;
        12..16: begin
                  if str[1] in [0..9] then 有卡号 else 无卡号 再算是否有中英文
                  ... //跟 0..11相同
      else
        ..  
      end;
    end;
      

  4.   

    我想是否方便判断,这不是应该靠编码去实现,而是你的前期设计问题,你应该让这些字段符合对应的规则,这样才能在你的程序中做更好的更准确的处理
    1.如果是数据集的话,完全可以判断每列对应的fieldname
    2.如果是文本,设计初期,就应该规划好,每一类数据,需要符合的规则,不能乱套,比如我们看发票,发票号都是有规矩遵循的,不可能今天一个样子,明天一个样子,如果符合了某种规定,那你判断就易如反掌了,根本不需要考虑去用代码来识别是哪个字段
      

  5.   

    用EXCEL分列一下就好了,还不简单
      

  6.   


    //写个函数来分解字符串
    procedure SplitData(sData: String;  var sCardNo, sName, sValue: String);
    var
      AList : TStringList;
      iLoop : Integer;
    begin
      sCardNo := '';
      sName := '';
      sValue := '';
      AList := TStringList.Create;
      try
        AList.Delimiter := ' ';
        AList.DelimitedText := sData;
        if AList.Count = 3 then
          for iLoop := 0 to 2 do
            if AList.Strings[iLoop][1] in ['0'..'9'] then
              if Pos('.', AList.Strings[iLoop]) > 0 then
                sValue := AList.Strings[iLoop]
              else
                sCardNo := AList.Strings[iLoop]
            else
              sName := AList.Strings[iLoop];
      finally
        AList.Free;
      end;
    end;//调用的例子:
    var
      sCardNo, sName, sValue: String;
    begin
      SplitData('1111111111111111 张三 2197.50', sCardNo, sName, sValue);
      ShowMessage ('卡号:' + sCardNo + ', 姓名:' + sName + ', 金额:' + sValue);
      SplitData('李四 2222222222222222 2379.00', sCardNo, sName, sValue);
      ShowMessage ('卡号:' + sCardNo + ', 姓名:' + sName + ', 金额:' + sValue);
      SplitData('王五 2479.00 3333333333333333', sCardNo, sName, sValue);
      ShowMessage ('卡号:' + sCardNo + ', 姓名:' + sName + ', 金额:' + sValue);
      SplitData('2579.00 赵六 4444444444444444', sCardNo, sName, sValue);
      ShowMessage ('卡号:' + sCardNo + ', 姓名:' + sName + ', 金额:' + sValue);
    end;