2012-02-29 4 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'; 

вещь IF, то утверждение не похоже на работу. Если значение IncomeStream - «900 Industrial» (проверено через отладчик), MYOBSalesAc будет вместо «41200». сравнение не работает. То же самое для всех значений. Использование AnsiComparestr не дает правильных результатов.

любые указатели?

рассматривает Rashid

+0

'IncomeStream' не то, что вы говорите это. «AnsiCompareStr», как известно, работает правильно. –

+0

Я попытался использовать IncomeStream = '900 Industrial', где IncomeStream = '900 Industrial'. Результат будет ложным, когда это должно быть правдой. – mra

+0

Известно, что оператор '=' работает правильно. –

ответ

4

AnsiCompareStr, то равно оператор сравнения = все известны, чтобы работать правильно. Таким образом, мы можем заключить, что IncomeStream не имеет значения '900 Industrial'. Наиболее очевидная возможность состоит в том, что пространство на самом деле является некоторой другой формой пробелов. Возможно, символ табуляции. Или, возможно, неразрывное пространство. Или, может быть, это два пробела.

Посмотрите на двоичное представление двух строк и сравните их.

+0

спасибо david, но вы потеряли меня там, в двоичном представлении, какой-нибудь примерный код, спасибо заранее. – mra

+0

Посмотрите на значение 'ord (IncomeStream [4])' в отладчике. Если бы это было пространство, то это было бы 32. –

+0

он возвращает 32. Таким образом, нужно удалить пустое пространство. спасибо. – mra

0

Для сравнения текста такого типа лучше использовать AnsiSameText. AnsiSameText будет делать сравнение без учета регистра. Для сравнения с регистром следует использовать AnsiSameStr. Если вы используете D2009 или выше, вы должны использовать SameText и SameStr.

+0

Что не так с SameText и SameStr на ansi delphis? –

+3

К сожалению, вы ошибаетесь. Ansi во имя функции СЛЕДУЕТ в здравом мире, означает, что это функция только для строк Ansi, но по разным историческим причинам это НЕ означает, что в Delphi. Внимательно прочитайте документы и наблюдайте за хаосом. –

+1

В Delphi до 2009 года SameText и SameStr не работают без символов ASCII [link] (http://en.wikipedia.org/wiki/ASCII). Попробуйте этот код на Delphi7: «если SameText (« español »,« ESPAÑOL ») ...», и вы скажете, что я говорю. –

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; 
Смежные вопросы