2012-02-29 99 views
-1

我得到这个部分代码:为什么这个字符串比较不起作用?

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'; 

的事情是,如果再声明似乎并没有工作。如果IncomeStream的值是'900 Industrial'(通过调试器检查),MYOBSalesAc将是''而不是'41200'。 比较完全不起作用。它对所有的值都是一样的。使用AnsiComparestr不会给出正确的结果。

任何指针?

问候 拉希德

+0

'IncomeStream'是不是你说的样子。已知'AnsiCompareStr'工作正常。 – 2012-02-29 14:50:27

+0

我试着使用IncomeStream ='900 Industrial',其中IncomeStream ='900 Industrial'。如果它是真的,结果是错误的。 – mra 2012-02-29 14:54:35

+0

'='运算符也可以正常工作。 – 2012-02-29 14:55:21

回答

4

AnsiCompareStr,等号比较运算符=是所有已知的正常工作。因此,我们只能得出结论,IncomeStream不具有值'900 Industrial'。最明显的可能是该空间实际上是一些其他形式的空白。也许是制表符。或者也许是一个不间断的空间。或者也许是两个空格。

看看这两个字符串的二进制表示并进行比较。

+0

感谢大卫,但是你在二进制表示中丢失了我的位置,请提前致谢 – mra 2012-02-29 15:03:16

+0

查看'ord(IncomeStream [4])的值'在调试器中,如果它是一个空格,那么它将会是32. – 2012-02-29 15:06:14

+0

它返回一个32.因此需要删除空格,谢谢 – mra 2012-02-29 15:25:10

0

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

+0

ansi delphis上的SameText和SameStr有什么问题? – 2012-02-29 18:27:14

+3

可悲的是,克里斯托弗你错了。 Ansi以一个功能的名义应该在一个理智的世界里,这意味着它只是Ansi字符串的一个函数,但由于各种历史原因,这并不意味着在Delphi中。仔细阅读文档,观察混乱。 – 2012-02-29 19:03:28

+1

在2009年之前的Delphi中,SameText和SameStr无法使用ASCII [link](http://en.wikipedia.org/wiki/ASCII)字符。在Delphi7上试试这个代码:“如果SameText('español','ESPAÑOL')...”,你会承担我说的。 – 2012-02-29 19:24:07

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;