Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 097

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Я тут думаю. Как можно проверить что строка это число. Можно попробовать перевести в Integer и использовать исключительную ситуацию, но можно наверное по другому. Короче подскажите как.

Gooddy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Gooddy (статус: 3-ий класс)
Вопрос отправлен: 6 ноября 2007, 14:38
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Wallpk!
Можно воспользоваться функцией паскаля val
пример кода

var s:string;
i,k:integer;
begin
s:='22';
val(s,i,k);
if k <>0 then ошибка, k символ плох
else  i - результат
а можно и воспользоваться функцией StrToIntDef
первый параметр аналогичный Strtoint, а второй - число, которое возвратит функция, если ничего не удалось.

но можно и попроще:)
function Check(s:string):boolean;
var i:integer;
begin
for i:=1 to length(s) do 
 if not s[i] in ['0'..'9'] then begin result := false; exit; end;
resukt := true;
end;

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 ноября 2007, 14:53
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, Wallpk!
В дополнении к "Вадим К".
Можно вот этой функцией из неизвестной строки вырезать указанные символы, например, числа 0-9:

type 
TCharSet = set of Char; 
 
function StripNonConforming(const S: string; 
const ValidChars: TCharSet): string; 
var 
DestI: Integer; 
SourceI: Integer; 
begin 
SetLength(Result, Length(S)); 
DestI := 0; 
for SourceI := 1 to Length(S) do 
   if S[SourceI] in ValidChars then 
   begin 
     Inc(DestI); 
     Result[DestI] := S[SourceI] 
   end; 
SetLength(Result, DestI) 
end; 
 
function StripNonNumeric(const S: string): string; 
begin 
Result := StripNonConforming(S, ['0'..'9']) 
end;

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 6 ноября 2007, 15:11
Оценка за ответ: 4

Ответ #3. Отвечает эксперт: min@y™

К предыдущим ответам хочу добавить свою наработку. Когда-то для написания интерпретатора понадобилось распознавание и перевод в Integer не только десятичных, но и шестнадцатеричных, восьмеричных и двоичных констант языков С/С++ и ассемблера, таких как, например:


  • 56789 - десятичое;

  • 5BFh - шестнадцатеричное с суффиксом "h" или "H";

  • 0x5BF - шестнадцатеричное с префиксом "0x", "0X";

  • 0567 - восьмеричное (начинается с нуля);

  • 01001001b - двоичное с суффиксом "b", "B".


Т.е. функция сама распознаёт систему счисления числа и в случае, если строка числом не является, выдаёт исключение.
В результате получилась вот такая парочка функций:
uses
  SysUtils, 
  RxStrUtils;  // Этот модуль пакета RxLib для функции Numb2Dec()
 
type
  TDigitsSet = set of Char;
 
const
  HexDigits: TDigitsSet = ['0'..'9', 'A'..'F', 'a'..'f'];
  OctDigits: TDigitsSet = ['0'..'7'];
  DecDigits: TDigitsSet = ['0'..'9'];
  BinDigits: TDigitsSet = ['0', '1'];
 
function IsValueSystem(const S: string; const ASystem: Byte): Boolean;
var
  i: Integer;
  Digs: TDigitsSet;
begin
  Result:= False;
  if S = ''
    then Exit;
 
  case ASystem of
    16: Digs:= HexDigits;
     8: Digs:= OctDigits;
    10: Digs:= DecDigits;
     2: Digs:= BinDigits;
  else
        Digs:= [];
  end;
 
  for i:= 1 to Length(S) do
    if not (S[i] in Digs)
      then Exit;
 
  Result:= True;
end;
 
function AdvancedStr2Int(const AValue: string): Integer;
var
  Len: Integer;
  Q: string; // Число с отрезанным суффиксом b или h.
begin
  Len:= Length(AValue);
  if Len = 0
    then raise Exception.Create('Вместо числа - пустая стока');
 
  Q:= Copy(AValue, 1, Len - 1);
  if (AValue[Len] in ['H', 'h']) and IsValueSystem(Q, 16)
    then begin
           Result:= StrToInt('$' + Q);
           Exit;
         end;
 
  Q:= Copy(AValue, 3, Len - 2);
  if (LowerCase(Copy(AValue, 1, 2)) = '0x') and IsValueSystem(Q, 16)
    then begin
           Result:= StrToInt('$' + Q);
           Exit;
         end;
 
  Q:= Copy(AValue, 1, Len - 1);
  if (AValue[Len] in ['B', 'b']) and IsValueSystem(Q, 2)
    then begin
           Result:= Numb2Dec(Q, 2);
           Exit;
         end;
 
  if (AValue[1] = '0') and IsValueSystem(Copy(AValue, 2, Len - 1), 8)
    then begin
           Result:= Numb2Dec(AValue, 8);
           Exit;
         end;
 
  if IsValueSystem(AValue, 10)
    then Result:= StrToInt(AValue)
    else raise Exception.Create('Строка "' + AValue + '" не является числом.');
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 ноября 2007, 08:25
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 6 ноября 2007, 23:25; участников в обсуждении: 3.
jackal

jackal (статус: Посетитель), 6 ноября 2007, 16:12 [#1]:

Извините что влез... Можно и м н е поумничать, так чисто для разнообразия результатов... парсим строку посимвольно проверяя каждый симбол
if char(simb)<124 or char(simb)>133 then
mess:= 'в не только число'
только char у цифр не помню ну гдето в данном районе надо будет посмотреть
jackal

jackal (статус: Посетитель), 6 ноября 2007, 16:23 [#2]:

извиняюсь за оплошность char это chr чето переклинило
Косолапов Дмитрий Юрьевич

Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 6 ноября 2007, 19:11 [#3]:

Если проверять посимвольно, то надо учесть, что первым символом может быть "-" (или даже "+"), а также десятичная точка (запятая).
Вадим К

Вадим К (статус: Академик), 6 ноября 2007, 23:25 [#4]:

to Косолапов Дмитрий Юрьевич:
В вопросе чётко написано Integer. Ни о каких десятичных точках не может быть и речи. А вот знак вначале - это да.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 14 декабря 2017, 16:05
Выполнено за 0.1 сек.
Рейтинг@Mail.ru