Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Incopatible types: 'String' and 'Char' [D5, Win2k]


Страницы:   1 2

aliced ©   (2004-11-19 19:48:00) 

Incopatible types: 'String' and 'Char' получаю на такой строке
if not
(copy(_Name,i,1) in ['0','1','2','3','4','5','6','7','8','9',',']) then


Хотя, впрочем, такой же результат дает
_Name[Pos('.', _Name)] := ',';
(_Name:string;)

Пример из хелпа:
var S: string;
begin
 S := '   123.5';
 { Convert spaces to zeroes }
 while Pos(' ', S) > 0 do
   S[Pos(' ', S)] := '0';
end;

тоже не работает!
А надо-то мне всего-то символьную строку преобразовать в число!
Строка может содержать '.' вместо ',', а может вообще содержать какие-то кракозябры (строку возвращает устройство на com-порту)

Delphi 5.5


KilkennyCat   (2004-11-20 17:12:00) [1]

function FormatStr(Str: String, NumberDel : byte): String;
var
I: Integer;
b : byte;
begin
 b := 1;
 for I := Length(Str) downto 1 do
  if (Str[I] in ['.', ',']) and (Str[I] <> DecimalSeparator) and (NumberDel = b)
  then begin
    Str[I] := DecimalSeparator;
    inc(b);
  end
    else if not (Str[I] in ['0'..'9', DecimalSeparator])
      then
        Delete(Str, I, 1);
 Result := Str
end.


с выбором нужной запятой... хотя, опять же, можно выбрать вторую, а их всего одна...


KilkennyCat   (2004-11-20 17:05:00) [2]


> begin...end ©   (20.11.04 17:00) [38]

хе, я об этом тоже подумал... но потом, когда кнопку нажал :)


begin...end   (2004-11-20 17:00:00) [3]


> [37] KilkennyCat ©   (20.11.04 16:57)


> и лишнего как не бывало

Откуда Вы знаете, какую запятую нужно оставить?


KilkennyCat   (2004-11-20 16:57:00) [4]


> begin...end ©   (20.11.04 16:53) [36]
>
> > [33] aliced ©   (20.11.04 16:38)
>
> function FormatStr(Str: String): String;
> var
>  I: Integer;
  b: boolean
> begin
  b := true;
>  for I := Length(Str) downto 1 do
>    if (Str[I] in ['.', ',']) and (Str[I] <> DecimalSeparator) and b
> then begin
>      Str[I] := DecimalSeparator;
      b := false;
   end
>    else if not (Str[I] in ['0'..'9', DecimalSeparator])
> then
>      Delete(Str, I, 1);
>  Result := Str
> end.


и лишнего как не бывало.


begin...end   (2004-11-20 16:53:00) [5]


> [33] aliced ©   (20.11.04 16:38)

function FormatStr(Str: String): String;
var
 I: Integer;
begin
 for I := Length(Str) downto 1 do
   if (Str[I] in ['.', ',']) and (Str[I] <> DecimalSeparator) then
     Str[I] := DecimalSeparator
   else if not (Str[I] in ['0'..'9', DecimalSeparator]) then
     Delete(Str, I, 1);
 Result := Str
end.

После этого необходимы, конечно, дополнительные проверки, а то вдруг там окажется две запятых подряд.


Anatoly Podgoretsky   (2004-11-20 16:43:00) [6]

aliced ©   (20.11.04 16:38) [33]

Вот это str:=trim(str); поместить перед for


kaZaNoVa   (2004-11-20 16:41:00) [7]

aliced ©   (20.11.04 16:38) [33]
Оксана, дай номер аськи :))
моя 1035000


aliced   (2004-11-20 16:38:00) [8]

Спасибо всем, вроде справилась. Хотя все равно странно как-то всё...

Получила ф-ю, которую делаю перед преобразованием в число
function FormatStr(str:string):string;  //ïðåîáðàçóåò ñòðîêó äëÿ êîìàíäû  StrToInt
var i:integer;
begin
   str:=StringReplace(str,'.',',',[rfIgnoreCase]); // str[pos('.',str]:=',';
   for i:=1 to length(str) do
   begin
     if not (str[i] in ['0','1','2','3','4','5','6','7','8','9',',']) then
       str:=copy(str,1,i-1)+''+copy(str,i+1,length(str));    //str[i]:='';
   end;
   str:=trim(str);
   if str='' then str:='0';
   result:=str;
end;


Anatoly Podgoretsky   (2004-11-20 16:22:00) [9]

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


begin...end   (2004-11-20 16:17:00) [10]


> [29] KilkennyCat ©   (20.11.04 15:37)


> в данном случае, для замены пробелов на нули

Да не надо ей пробелы на нули заменять. Ей строковое представление числа нужно перевести в число. Её беспокоит, что в строке могут быть символы, отличные от '0'..'9' и DecimalSeparator. Так пусть удалит их оттуда и не мучается. Хотя, может быть, я не так что-то понял...


KilkennyCat   (2004-11-20 15:49:00) [11]

кроме того, если длина непосредсвенно числа всегда постоянна, то - RightStr()

и вроде бы, Trim тоже может помочь.


KilkennyCat   (2004-11-20 15:37:00) [12]

для замены чего-либо строчного можно использовать функцию StringReplace

в данном случае, для замены пробелов на нули:

StringReplace(_Name, ' ', '0', [rfReplaceAll]);


KilkennyCat   (2004-11-20 15:25:00) [13]


> Юрий К   (20.11.04 15:06) [27]


молодец!


Юрий К   (2004-11-20 15:06:00) [14]

Попробовал так:
   b : Byte;
   b := Byte(s[1]);
   if not (b in [Ord('0')..Ord('9'),Ord(','),Ord('.')]) then


Anatoly Podgoretsky   (2004-11-20 14:56:00) [15]

Palladin ©   (20.11.04 14:52) [24]
Кому трагедия, а кому и нет :-)

Юрий К   (20.11.04 14:52) [25]
А вот так не надо, сначала сам попробуй.


Юрий К   (2004-11-20 14:52:00) [16]

А если так

Byte b;
b = Ord(_name[i]);
if not (b in ['0'..'9',',','.']) then ...


Palladin   (2004-11-20 14:52:00) [17]

Какая трагедия


aliced   (2004-11-20 14:32:00) [18]

Конечно ж не на всех!
Если я вчера ушла, это не значит, что я сегодня не вернусь и не продолжу ;)


Anatoly Podgoretsky   (2004-11-19 21:16:00) [19]

begin...end ©   (19.11.04 21:04) [21]
Надеюсь, что не на всех :-)


begin...end   (2004-11-19 21:04:00) [20]


> [20] Anatoly Podgoretsky ©   (19.11.04 21:01)

Бесполезно, на нас всех уже махнули. :-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо