Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо