Есть ли метод в Delphi для проверки, является ли строка числом без привлечения исключения?
его для int parsing.
и исключение будет повышаться, если вы используете
try
StrToInt(s);
except
//exception handling
end;
Есть ли метод в Delphi для проверки, является ли строка числом без привлечения исключения?
его для int parsing.
и исключение будет повышаться, если вы используете
try
StrToInt(s);
except
//exception handling
end;
var
s: String;
iValue, iCode: Integer;
...
val(s, iValue, iCode);
if iCode = 0 then
ShowMessage( has a number')
else
ShowMessage( has not a number');
function TryStrToInt (const S: string; out Значение: Integer): Boolean;
TryStrToInt преобразует строку S, которая представляет число целочисленного типа в десятичной или шестнадцатеричной нотации, в число, которое присваивается значению. Если S не представляет действительное число, TryStrToInt возвращает false; в противном случае TryStrToInt возвращает true.
Чтобы принять десятичные, но не шестнадцатеричные значения во входной строке, вы можете использовать такой код:
function TryDecimalStrToInt( const S: string; out Value: Integer): Boolean;
begin
result := ( pos( '$', S ) = 0 ) and TryStrToInt( S, Value );
end;
Попробуйте выполнить эту функцию StrToIntDef()
С помощью
Преобразует строку, представляющую целое число (десятичная или шестнадцатеричная нотация) в число с ошибкой по умолчанию.
Паскаль
function StrToIntDef(const S: string; Default: Integer): Integer;
Edit
Только что проверил источник функции TryStrToInt()
в Delphi 2007. Если Delphi 7 не имеет этой функции, вы можете написать вот так. Его просто полированный код для да-мягкого ответа
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
используйте эту функцию
function IsNumber(N : String) : Boolean;
var
I : Integer;
begin
Result := True;
if Trim(N) = '' then
Exit(False);
if (Length(Trim(N)) > 1) and (Trim(N)[1] = '0') then
Exit(False);
for I := 1 to Length(N) do
begin
if not (N[I] in ['0'..'9']) then
begin
Result := False;
Break;
end;
end;
конец;
Для более старых версий Delphi из примера справки delphi 5:
uses Dialogs;
var
I, Code: Integer;
begin
{ Get text from TEdit control }
Val(Edit1.Text, I, Code);
{ Error during conversion to integer? }
if Code <> 0 then
MessageDlg('Error at position: ' + IntToStr(Code), mtWarning, [mbOk], 0);
else
Canvas.TextOut(10, 10, 'Value = ' + IntToStr(I));
end;
В delphi 7 вы можете использовать процедуру Val
. С помощью:
Единица: Система
Синтаксис Delphi: procedure Val(S; var V; var Code: Integer);
S является строковым выражением; это должна быть последовательность символов, которые образуют подписанное действительное число.
V - переменная целочисленного типа или реального типа. Если V - переменная целочисленного типа, S должно образовать целое число.
Код - это переменная типа Integer.
Если строка недействительна, индекс нарушающего символа сохраняется в коде; иначе код будет равен нулю. Для строки с нулевым завершением позиция ошибки, возвращаемая в Code, больше, чем фактический нулевой индекс символа с ошибкой.
В некоторых языках десятичные разделители различаются (например, "." используется на английском языке, а "," используется на русском языке). Для этих случаев для преобразования строки в реальный номер предлагается следующая процедура:
function TryStrToFloatMultylang(const S : String; out Value : Extended) : Boolean;
var
dc : char;
begin
Result := false;
dc := DecimalSeparator;
DecimalSeparator := '.';
try
Result := TryStrToFloat(S, Value);
except
DecimalSeparator := ',';
Result := TryStrToFloat(S, Value);
end;
DecimalSeparator := dc;
end;
Обновление
Поскольку @Pep упоминает исключения TryStrToFloat catch, но возвращает логическое значение. Поэтому правильный код:
function TryStrToFloatMultylang(const S : String; out Value : Extended) : Boolean;
var
dc : char;
begin
Result := false;
dc := DecimalSeparator;
DecimalSeparator := '.';
Result := TryStrToFloat(S, Value);
if not Result then begin
DecimalSeparator := ',';
Result := TryStrToFloat(S, Value);
end;
DecimalSeparator := dc;
end;
XE4 и новее:
for ch in s do
TCharacter.IsNumber(ch);
Не забывайте:
uses System.Character
При использовании процедуры
val (s, i, iCode);
и установить значение xd....
val ('xd', i, iCode)
в результате получим: 13
Мне нравится эта функция StrToIntDef(number, 0)
чтобы не возникало никаких ошибок исключений.
Стандартные единицы Варианты
function VarIsNumeric(v:Variant):Boolean