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

String 为什么这个字符串比较不起作用?,string,delphi,comparison,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 :=

我得到了这个部分代码:

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-then语句似乎不起作用。如果IncomeStream的值为“900 Industrial”(通过调试器检查),则MYOBSalesAc将为“41200”。 这种比较根本不起作用。所有值都是相同的。使用AnsiComparestr不会给出正确的结果

有什么建议吗

问候
rashid

AnsiCompareStr
,equals比较运算符
=
都可以正常工作。因此,我们只能得出结论,
IncomeStream
不包含值
'900 Industrial'
。最明显的可能性是空格实际上是其他形式的空白。也许是制表符。或者是一个不间断的空间。或者可能是两个空间


查看两个字符串的二进制表示形式并对其进行比较。

对于此类文本比较,最好使用AnsiSameText。AnsiSameText将进行不区分大小写的比较。对于区分大小写的比较,请改用AnsiSameStr。如果您使用的是D2009或更高版本,则必须使用SameText和SameStr。

要找出差异所在,请使用您自己的比较函数。一个字符一个字符地看,直到你发现什么在你的眼睛看来是一样的,但在序数值上是不同的

其他人建议使用调试器,但如果您不能这样做,那么就编写代码

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;
函数comparestext(s1,s2:String;var idx:Integer;var c1,c2:Char):布尔;
变量
len1,len2,minlen:整数;
开始
结果:=真;
c1:=Chr(0);
c2:=Chr(0);
idx:=1;
len1:=长度(s1);
len2:=长度(s2);
minlen:=len1;
如果len2len2那么
c2:=Chr(0)
其他的
c2:=s2[idx];
结果:=(len1=len2);
结束;
下面是一个示例调用:

  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;
如果不是comparestext('123','123a',idx,c1,c2),则开始
//使顺序数字(二进制)值对您的眼球可见。
msg:=IntToStr(Ord(c1))+“”+IntToStr(Ord(c2));
结束;

IncomeStream
不是你说的那样
AnsiCompareStr
工作正常。我尝试使用IncomeStream='900 Industrial',其中IncomeStream='900 Industrial'。结果应为true时为false。
=
运算符也可以正常工作。由于Trim()应获取并返回字符串,因此不确定为什么要对结果执行Trim()和VarToStr()。SheetData.Cells包含什么类型的单元格?请注意:如果单元格为空,您应该真正使用
Trim(VarToStr(SheetData.Cells[7,strow])
。不是
VarToStr(Trim(…
,因为
VarToStr
在这种情况下是没有意义的。谢谢david,但是你在二进制表示方面失去了我。有样本代码吗?提前谢谢。请查看
ord的值(IncomeStream[4])
在调试器中。如果它是一个空格,那么它将是32。它返回一个32。因此需要删除空白。谢谢。不需要。您正在比较的字符串在字符4中也有一个空格。您正在查找差异。请检查两个字符串的每个字符的序号值是否相同,长度是否相同。No、 @User,这不是正确的结论。第四个字符应该是一个空格。您确认的是该字符是正确的。不要删除它。字符串中的差异在其他地方。使用调试器找出位置。遗憾的是CHristopher,您错了。函数名称中的Ansi应该在理智的世界中,意思是这是一个仅用于Ansi字符串的函数,但由于各种历史原因,这并不意味着在Delphi中是这样的。请仔细阅读文档,观察混乱情况。在Delphi的2009年之前的版本中,SameText和SameStr不使用ASCII字符。请在Delphi7上尝试以下代码:“如果SameText('español','español')…”你会理解我说的话。你认为我们在Delphi 2009及更高版本中“必须”使用SameText的论点是,在以前的版本中,SameText的工作方式没有达到一些人对非ASCII字符的预期。这是一个伪论点。“你必须现在使用它,因为它以前被破坏过。”此外,您在这里推荐不同的函数也没有抓住要点。在我们看来,我们可以清楚地看到这两个字符串应该与AnsiCompareStr匹配;case显然不是问题所在,因此不区分大小写的函数不会解决任何问题。@WarrenP,您错了,Ansi前缀表示区域设置支持,而不是字符串类型。@Rob、 您在Delphi>=2009上使用AnsiCompareStr时失去了unicode支持,因此我们必须(至少)在D2009上使用CompareStr。我建议使用AnsiCompareStr进行排序列表。对于文本视觉或词汇比较,请使用SameText和Similar。