为什么这个字符串比较不起作用?

时间:2012-02-29 14:46:39

标签: string delphi comparison

我得到了这个部分代码:

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无法给出正确的结果。

任何指针?

问候 拉希德

3 个答案:

答案 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;