形如一下的字符串,怎么处理才能把各字段的个值(为数字)取出呢?(200)

  • 主题发起人 主题发起人 oiget
  • 开始时间 开始时间
O

oiget

Unregistered / Unconfirmed
GUEST, unregistred user!
形如一下的字符串,怎么处理才能把各字段的个值(为数字)导入到数据库呢?"日期:20100428编XX码:1001金额:48880.3"字符串为“字段A”、“字段B”和“字段C”的值用"中文"连接起来的,但串的总长度不确定,因为每个字段的值不定;现要求把串里的几个数字,如20100428、1001、48880.3分别保存至数据表的A、B、C字段,关键是如何把这些数字(也有小数点)分别取出来呢?
 
用特殊字符连接.比如符串为“字段A”、“字段B”和“字段C”的值用"中文"连接起来为:“字段A#字段B#字段C” 这样在处理的时候就可以分割,导入到数据库中的A、B、C字段中。
 
使用VAL函数可以完成部分然后就设个变量判断字符吧,不在0-9,和小数点的时候,分割数字字符串就是说,用变量来记录数字字符串,if str in ['0'..'9', '.'] then sNumber := sNumber + str else begin 处理第一个sNumber 然后sNumber := ''; str := copy(str, i + 1, len(str) - i); 再递归调用此函数,直到字符串为空end;
 
引用ComObj单元,加入一个TEDIT控件,将其TEXT属性设为:"日期:20100428编XX码:1001金额:48880.3";然后用下面代码测试。procedure TForm1.Button1Click(Sender: TObject);var MyRegExp, Matches: OleVariant; i: integer;begin MyRegExp := CreateOleObject('VBScript.RegExp'); MyRegExp.Global := true; MyRegExp.IgnoreCase := false; MyRegExp.Pattern := '[/d.]+'; if MyRegExp.Test(Edit1.Text) then begin Matches := MyRegExp.execute(Edit1.Text); for i := 1 to Matches.count do //显示找到的结果 begin ShowMessage(Format('找到的第%d个:%s', [i, Matches.item[i - 1]])) end; end;end;
 
这种需求肯定用正则表达式是最方便的。Delphi下有一个RegExpr,你下载来用就是了。
 
...implementation{$R *.dfm}procedure SpliteStr(const AStr:string;var vRQ,vBM,vJE:Double);var s:string; i,iB,iL,iC:Integer; fValue:Double;begin s:=trim(AStr)+#10; iB:=-1; iL:=length(s); iC:=0; vRQ:=0; vBM:=0; vJE:=0; for i:=1 to iL do begin if s=':' then iB:=i; if iB<>-1 then if not (s in ['0'..'9','.',':']) then begin inc(iC); fValue:=StrToFloat(Copy(s,iB+1,i-iB-1)); case iC of 1: vRQ:=fValue; 2: vBM:=fValue; 3: vJE:=fValue; end; iB:=-1; end; end;end;procedure TForm1.Button1Click(Sender: TObject);var fRQ,fBM,fJE:Double;begin edit1.Text:='日期:20100428编XX码:1001金额:48880.3'; SpliteStr(trim(edit1.Text),fRQ,fBM,fJE); Memo1.Lines.Clear; Memo1.Lines.Add('日期:'+FloatToStr(fRQ)); Memo1.Lines.Add('编码:'+FloatToStr(fBM)); Memo1.Lines.Add('金额:'+FloatToStr(fJE));end;
 
后退
顶部