比如某数据1111111111111111 张三 2197.50
2222222222222222 李四 2379.00 其中卡号为12位或16位,姓名为中文或E文,但是排列的顺序有时是姓名卡号金额,有时是卡号姓名金额,一共有6种可能,现在求一个聪明的算法
2222222222222222 李四 2379.00 其中卡号为12位或16位,姓名为中文或E文,但是排列的顺序有时是姓名卡号金额,有时是卡号姓名金额,一共有6种可能,现在求一个聪明的算法
解决方案 »
- Delphi2007:[DCC Error] Main.pas(364): E2010 Incompatible types: 'DBGridEh.TGridDrawState' and 'Main.TGridDrawState'?
- 关于在memo的keydown事件中焦点下移
- 请问能给菜单加背景吗?怎么加?
- 关于在ehlib中设置了下拉列表,就是picklist中add了内容
- 请教几个多层开发技术的术语,高手请进
- 各位大侠,delphi中如何备份access,在线等待
- 提示怎么不行?(hint不起作用)
- 刚学不好意思问:StatusBar这个控件如何加竖条变成格格,谢了.
- Delphi中关于卸载u盘的问题
- 不知道大家用不用codeRush6,今天装上后真是太爽了
- 能否利用控件一次调用多个存储过程?
- 关于cxgrid隔行着色的问题
1111111111111111 张三 2197.50
2222222222222222 李四 2379.00
看你数据的格式,这样可以判断不:
金额判断:判断是不是有小数点. pos();
卡号判断:先判断为数字,且不含小数点,然后length(字符串):=12 or 16 (由于金额的话长度一般不会为这么大了,且你的金额是包含小数点的)
名字判断: 剩下的就是这个字段了。
不知这样可行不?
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;
1.如果是数据集的话,完全可以判断每列对应的fieldname
2.如果是文本,设计初期,就应该规划好,每一类数据,需要符合的规则,不能乱套,比如我们看发票,发票号都是有规矩遵循的,不可能今天一个样子,明天一个样子,如果符合了某种规定,那你判断就易如反掌了,根本不需要考虑去用代码来识别是哪个字段
//写个函数来分解字符串
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;