Почему это сравнение строк не работает? - PullRequest
0 голосов
/ 29 февраля 2012

я получил этот частичный код:

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 не дает правильных результатов.

какие-либо указатели?

в отношении rashid

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

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

Взгляните на двоичное представление двух строк и сравните их.

0 голосов
/ 29 февраля 2012

Чтобы узнать, в чем заключается разница, используйте собственную функцию сравнения.Идите символ за символом, пока не найдете то, что выглядит одинаково для ваших глаз, но отличается по порядковому значению.

Другие люди предложили использовать отладчик, но если вы не можете этого сделать, напишите код.

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;
0 голосов
/ 29 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...