Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как определить, что строка начинается с цифры?


Автор: five 21.4.2005, 16:05
Не хотелось бы изобретать велосипед, но никак не могу сообразить как определить, что строка начинается с цифры?
Может кто чего подскажет?
Заранее спасибо.

Автор: z-END 21.4.2005, 16:13
наверно так:
Код
 if somestr[1] in ['0'..'9'] then  ...


Автор: Satana 21.4.2005, 16:14
объви множество, и делай так if str[1] in <твое множество> значит цифра

Автор: Dimannn 21.4.2005, 21:12
Можно и так
Код

try 
InttoStr(Copy(yourstring,1,1));
Cifra:=true;
except
Cifra:=false;
end;

Хотя Delphi серавно эррор покажет

Автор: Marriage 22.4.2005, 12:39

#48 - 0
#57 - 9

Код

IF str[0] >=48 and str[0]<=57 then
   Цыфра!!!!

Автор: ~FoX~ 22.4.2005, 13:10
Val(s, i, code)
s - строка
i - кладем число
code - позиция символа который не является числом

Это как альтернатива, прелесть в том, что число может состоять из более чем одного символа.

Автор: Akella 23.4.2005, 08:53
Marriage, стока начинается не нулевого индекса, а с единицы

Код

IF str[1] >=48 and str[1]<=57 then
   Цыфра!!!!

Автор: Marriage 23.4.2005, 21:34
dsergey
Ну да, глюканул ...
Просто прогу на С сдавал недавно ...
Привык smile

Автор: mvdr 24.4.2005, 04:03
Код

if (str[1]='0') or (str[1]='1')... or (str[1]='9') then ShowMessage('Строка начинаеться с цифры');

Автор: vintch 25.4.2005, 14:36
Цитата
if (str[1]='0') or (str[1]='1')... or (str[1]='9') then ShowMessage('Строка начинаеться с цифры');

Тупее не видал smile

а вот правильный вариант уже был предложен:
Код

if str[1] in ['0'..'9'] then ...

Автор: Yanis 25.4.2005, 15:35
Цитата(Marriage @ 22.4.2005, 12:39)
IF str[0] >=48 and str[0]<=57 then
  Цыфра!!!!

Кто же Char с Integer сравнивает. Incompatible types, однако! Да к тому же слово "цыфра" написано с ошибкой.

To vintch
Цитата(vintch @ 25.4.2005, 14:36)
а вот правильный вариант уже был предложен:

А остальные варианты ошибочные? (кроме варианта от Marriage)

Автор: Pakshin A. S. 25.4.2005, 15:38
Может стоит поговорить о том, какой вариант будет работать быстрее и качественнее? а?

Автор: Yanis 25.4.2005, 19:13
По моему вариант
Цитата(vintch @ 25.4.2005, 14:36)
if str[1] in ['0'..'9'] then ...

самый качественный =)

Хотя Delphi в этом случае компилит такой код:
Код

  mov eax, [ebp-$04]
  mov al, [eax]
  add al, $d0
  sub al, $0a
  jnb +$0a

но по моему можно обойтись и таким:
Код

  mov eax, [s]
  mov al, [eax]
  sub al, VK_9
  jbe @@1_char_is_num

Экономим целую инструкцию =)

Автор: ~FoX~ 26.4.2005, 08:08
А если в 16-ти ричной системе smile

Автор: Marriage 26.4.2005, 11:51
Цитата

IF str[0] >=48 and str[0]<=57 then
  Цыфра!!!!

Кто же Char с Integer сравнивает. Incompatible types, однако! Да к тому же слово "цыфра" написано с ошибкой.


Согласен, правильнее было бы так

Код

IF ( integer(str[1]) >= 48 ) and ( integer(str[1]) <= 57 ) then
 ShowMessage('number!!!');


А в С бы прокатило, насколько я понимаю ...

Автор: Yanis 26.4.2005, 20:32
Цитата
А если в 16-ти ричной системе

Так это и есть в шестнадцатиричной. Просто забыл весь код привести. Сори...
Код

const
  VK_0 = $30;
  { ... }
  VK_9 = $39;
var
  s: String;
begin
  S := Edit1.Text;

  asm
    mov eax, [s]
    mov al, [eax]
    sub al, VK_9
    jbe @@1_char_is_num
    jmp @@exit

  @@1_char_is_num:
      mov eax, [s]
      call ShowMessage
  @@exit:
  end;

Код некорректно работает, если первый символ $20 (пробел) или символы с кодом меньше чем VK_0 smile

Цитата(Marriage @ 26.4.2005, 11:51)
Согласен, правильнее было бы так
IF ( integer(str[1]) >= 48 ) and ( integer(str[1]) <= 57 ) then
ShowMessage('number!!!');

По моему лучше так:
Код

  if (Ord(str[1]) >= 48) and (Ord(str[1]) <= 57) then
    ShowMessage('number!!!');

Так, вроде, на 2 такта быстрее smile

Автор: Marriage 26.4.2005, 20:59
Yanis
Цитата
Так, вроде, на 2 такта быстрее

А почему ???

Автор: Yanis 26.4.2005, 21:36
Код

  if (Integer(s[1]) >= 48) and (Integer(s[1]) <= 57) then
    ShowMessage('number!!!');

Этот код Delphi интерпретирует в такой:
Код

...
mov eax, [ebp-$04]
movzx eax, [eax] ; !!!
cmp eax, $30
...

А код
Код

  if (Ord(s[1]) >= 48) and (Ord(s[1]) <= 57) then
    ShowMessage('number!!!');

в
Код

...
mov eax, [ebp-$04]
mov eax, [eax] ; !!!
cmp eax, $30
...

Вот собственно и различие (надеюсь не наврал =))

Автор: Marriage 27.4.2005, 09:05
movzx - эт что за зверь такой ????

Автор: ~FoX~ 27.4.2005, 16:38
Цитата(Yanis @ 26.4.2005, 21:32)
Так это и есть в шестнадцатиричной. Просто забыл весь код привести. Сори...

Я имел ввиду не код, а число, допустим строка начинается с FFsdfsdf, F в данном случае число. smile

Автор: Yanis 27.4.2005, 18:44
Цитата
Я имел ввиду не код, а число, допустим строка начинается с FFsdfsdf, F в данном случае число.

Если бы сложилось так, что у нормальных людей было бы на обоих руках 32 пальцев, а не 20, то и шестнадцатиричные числа были бы учтены и вынесены на Num pad и всё таке прочее. К стати, что было бы с шестнадцатирчиными редакторами? ;)

P.S. Если в шестнадцатиричной, то не один приведённый выше код не работает smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)