我得到了这个部分代码:
var
MYOBCardId, WSCustCode, ExCode,
Destination, IncomeStream, MyobSalesAc: String;
IncomeStream := VarToStr(Trim(SheetData.Cells[7, StrRow]));
MyobSalesAc := '';
if IncomeStream = '840 DRUG-temp controlled' then
MyobSalesAc := '42400';
if AnsiCompareStr(IncomeStream,'900 Industrial') = 0 then
MyobSalesAc := '41200';
if IncomeStream = '950 Live Animals' then
MyobSalesAc := '41800';
事情是IF然后声明似乎不起作用。如果IncomeStream的值是'900 Industrial'(通过调试器检查),MYOBSalesAc将''代替'41200'。 比较根本不起作用。对于所有值都是一样的。使用AnsiComparestr无法给出正确的结果。
任何指针?
问候 拉希德
答案 0 :(得分:4)
AnsiCompareStr
,等于比较运算符=
都已知可正常工作。因此,我们只能得出结论:IncomeStream
不具有值'900 Industrial'
。最明显的可能性是空间实际上是一些其他形式的空白。也许是制表符。或者也许是一个不间断的空间。或者它可能是两个空格。
看一下两个字符串的二进制表示并比较它们。
答案 1 :(得分:0)
对于这种文本比较,最好使用AnsiSameText。 AnsiSameText将进行不区分大小写的比较。对于区分大小写的比较,请改用AnsiSameStr。如果您使用的是D2009或更高版本,则必须使用SameText和SameStr。
答案 2 :(得分:0)
要找出差异所在,请使用您自己的比较功能。逐个字符,直到你发现你的眼睛看起来相同,但顺序值不同。
其他人建议使用调试器,但如果你不能这样做,那就写代码。
function CompareStrExt(s1,s2:String; var idx:Integer; var c1,c2:Char):Boolean;
var
len1,len2,minlen:Integer;
begin
result := true;
c1 := Chr(0);
c2 := Chr(0);
idx := 1;
len1 := Length(s1);
len2 := Length(s2);
minlen := len1;
if len2<minlen then
minlen := len2;
while idx <= minlen do begin
c1 := s1[idx];
c2 := s2[idx];
if c1<>c2 then begin
result := false;
exit;
end;
Inc(idx);
end;
if idx>len1 then
c1 := Chr(0)
else
c1 := s1[idx];
if idx>len2 then
c2 := Chr(0)
else
c2 := s2[idx];
result := (len1=len2);
end;
以下是一个示例电话:
if not CompareStrExt('123','123a',idx,c1,c2) then begin
// make ordinal Numeric (binary) values visible to your eyeballs.
msg := IntToStr(Ord(c1)) + ' <> ' + IntToStr(Ord(c2));
end;