|
Вопрос # 1 097/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Я тут думаю. Как можно проверить что строка это число. Можно попробовать перевести в Integer и использовать исключительную ситуацию, но можно наверное по другому. Короче подскажите как.
 |
Вопрос задал: 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 (статус: Посетитель), 6 ноября 2007, 16:12 [#1]:
Извините что влез... Можно и м н е поумничать, так чисто для разнообразия результатов... парсим строку посимвольно проверяя каждый симбол
if char(simb)<124 or char(simb)>133 then
mess:= 'в не только число'
только char у цифр не помню ну гдето в данном районе надо будет посмотреть
|
|
jackal (статус: Посетитель), 6 ноября 2007, 16:23 [#2]:
извиняюсь за оплошность char это chr чето переклинило
|
|
Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 6 ноября 2007, 19:11 [#3]:
Если проверять посимвольно, то надо учесть, что первым символом может быть "-" (или даже "+"), а также десятичная точка (запятая).
|
|
Вадим К (статус: Академик), 6 ноября 2007, 23:25 [#4]:
to Косолапов Дмитрий Юрьевич:
В вопросе чётко написано Integer. Ни о каких десятичных точках не может быть и речи. А вот знак вначале - это да.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|