![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StrToInt
Dot © (2005-10-01 00:25:00)Как произвести StrToInt т.е. преобразовать строку в число без использования SysUtils?
Antonn (2005-10-03 06:46:00) [1]isasa © (02.10.05 21:45) [18]
Если сыр-бор загорелся вокруг EConvertError exception, то есть функция ( SysUtils)
а первый пост прочитать? :)
isasa (2005-10-02 21:45:00) [2]Если сыр-бор загорелся вокруг EConvertError exception, то есть функция (SysUtils)
function StrToIntDef(const S: string; const Default: Integer): Integer;
Converts a string that represents an integer (decimal or hex notation) to a number with error default.
Adder (2005-10-02 21:08:00) [3]
> XProger © (02.10.05 20:48) [16]
На все случаи жизни - при появлении ошибки вызывать специальную функцию обработки ошибок, передавая ей код ошибки. А в ней - по желанию, можно сообщение об ошибке выводить, а можно и систему грохать. -)
Второй вариант - написать функцию вида
function StrToInt(const str: string; var value:integer) : boolean;
которая результат преобразования будет возвращать в переменную value, а об успехе/не успехе (корректности value) можно будет судить по возвращаемому значению.
Или, например, так:
function StrToInt(const str: string; var ErrorCode:integer) : integer;
XProger (2005-10-02 20:48:00) [4]Adder, вернёт -1! Не верно разве? ;)
На все случаи жизни - грохать приложение при выявлении ошибки перевода? ;)))
Adder (2005-10-02 14:43:00) [5]
> XProger © (01.10.05 15:42) [14]
уже лучше, но не "на все случаи жизни" -)
//вызываем
k := StrToInt('-1');
и?
XProger (2005-10-01 15:42:00) [6]
function StrToInt(const str: string; def: integer = -1) : integer;
var
er : Integer;
begin
Val(str, Result, er);
if er <> 0 then
Result := def;
end;
// вызываем
k := StrToIntDef('lalala', -1000); // k = -1000
k := StrToIntDef('lalala'); // k = -1
k := StrToInt('100'); // k = 100
Adder (2005-10-01 12:30:00) [7]
> Signate © (01.10.05 11:05) [12]
ну и как сторона, вызывающая
> функцию, приведенную в посте [3], узнаетчто находилосьв локальной переменной Е?
Signate (2005-10-01 11:05:00) [8]
> Джо © (01.10.05 03:21) [6]
>
>
> > [5] Signate © (01.10.05 03:03)
>
> Это было очень любезно с вашей стороны вставить сюда кусок
> из Справки. Но я, тем не менее, остаюсь в полной неизвестности
> и заинтригованности относительно того, как сторона, вызывающая
> функцию, приведенную в посте [3], узнает о возможной ошибке.
>
хмм... а чего не понятноего? Если конвертирование не удалось то в переменную Code записывается какое то число, а если все успешно, то код содержит 0 ...
Adder (2005-10-01 09:10:00) [9]
> кому надо, пусть перебирает допустимые символы. StrtoInt
> учитывает? я привел его
"Отыщите 7 различий" (С)
function StrToInt(const S: string): Integer;
var
E: Integer;
begin
Val(S, Result, E);
if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
end;
(c) SysUtils.pas Delphi6
Adder (2005-10-01 09:03:00) [10]Удалено модератором
Antonn (2005-10-01 07:23:00) [11]Джо © (01.10.05 5:51) [8]
Как различить результат выполнения вот этих двух фрагментов:
1. Str2Int ('blablabla');
2. Str2Int ('0');
кому надо, пусть перебирает допустимые символы. StrtoInt учитывает? я привел его аналог.
Джо (2005-10-01 05:51:00) [12]
> [7] Antonn © (01.10.05 05:38)
То же самое :)
Как различить результат выполнения вот этих двух фрагментов:
1. Str2Int ('blablabla');
2. Str2Int ('0');
?
Antonn (2005-10-01 05:38:00) [13]function Str2Int(S: PChar): Integer;
asm
XCHG EDX, EAX
XOR EAX, EAX
TEST EDX, EDX
JZ @@exit
XOR ECX, ECX
MOV CL, [EDX]
INC EDX
CMP CL, '-'
PUSHFD
JE @@0
@@1: CMP CL, '+'
JNE @@2
@@0: MOV CL, [EDX]
INC EDX
@@2: SUB CL, '0'
CMP CL, '9'-'0'
JA @@fin
LEA EAX, [EAX+EAX*4]
LEA EAX, [ECX+EAX*2]
JMP @@0
@@fin: POPFD
JNE @@exit
NEG EAX
@@exit:
end;
Джо (2005-10-01 03:21:00) [14]
> [5] Signate © (01.10.05 03:03)
Это было очень любезно с вашей стороны вставить сюда кусок из Справки. Но я, тем не менее, остаюсь в полной неизвестности и заинтригованности относительно того, как сторона, вызывающая функцию, приведенную в посте [3], узнает о возможной ошибке.
Signate (2005-10-01 03:03:00) [15]If the string is invalid, the index of the offending character is stored in Code; otherwise, Code is set to zero.
Code - это последний параметр процедуры Val
Джо (2005-10-01 02:29:00) [16]
> [3] Delphi_is_cool © (01.10.05 01:11)
А, простите, как вызывающий код узнает о том, содержалась ли в S корректная строка?
Delphi_is_cool (2005-10-01 01:11:00) [17]
function StrToInt(const S: String) : Integer;
var
E: Integer;
begin
Val(S, Result, E);
end;
Вроде так ...
Плохиш (2005-10-01 00:40:00) [18]Пардон, val + F1
Плохиш (2005-10-01 00:38:00) [19]str + F1