1. Перевод строки в число, удаляя посторонние символы, находящиеся в этой строке
function StrToNumber(s: string; sym: string = ''): string;
const DS = ',';
var i, z: integer;
begin
{ удаляем посторонние символы }
for i:=Length(s) downto 1 do
if Pos(s[i], '0123456789-'+sym)=0 then
Delete(s, i, 1);
{ удаляем - }
for i:=Length(s) downto 2 do
if s[i]='-' then
Delete(s, i, 1);
{ удаляем , }
z:=Pos(DS, s);
if z>0 then
begin
for i:=Length(s) downto z+1 do
if s[i]=DS then
Delete(s, i, 1);
if s[1]='-' then
if (Length(s)>=2) and (s[2]=DS) then
Delete(s, 2, 1) else
else
if s[1]=DS then
Delete(s, 1, 1);
if (Length(s)>=1) and (s[Length(s)]=DS) then
Delete(s, Length(s), 1);
end;
if (s='') or (s='-') then
Result:='0' else
Result:=s;
end;
где:
s – исходная строка, содержащая цифры;
sym – допустимые символы.
Например,
StrToNumber('-8-5d2a12,s4,5', ',') выведет
'-85212,45'. В данном случае удалились
посторонние символы (буквы), и получилось '-8-5212,4,5'.
Далее были удалены лишние знаки "-" и ",".
Примечание. В операционных системах можно изменить
разделитель целой и дробной части. Например, вместо запятой можно поставить точку
(как в Англии). Тогда константа DS меняется на точку, чтобы избежать
ошибок. DS образовано от слова
DecimalSeparator, используемый в программной среде Delphi (намек понятен?).
2. Безопасный перевод строки в целое число
function StrToIntNew(s: string): int64;
begin
s:=StrToNumber(s);
Result:=StrToInt64(s);
end;
где:
s – целое число, записанное в строковом виде.
Например,
StrToIntNew('--426w785h,s1') выведет
'-4267851'.
3. Безопасный перевод строки в вещественное (дробное десятичное) число
function StrToFloatNew(s: string): real;
var e: integer;
s1, s2: string;
begin
s:=UpperCase(s);
e:=Pos('E', s);
if e>1 then
begin
s1:=Copy(s, 1, e-1);
s2:=Copy(s, e+1, Length(s));
s1:=StrToNumber(s1, ',');
s2:=StrToNumber(s2);
s:=s1+'E'+s2;
end else
s:=StrToNumber(s, ',');
Result:=StrToFloat(s);
end;
где:
s – вещественное (дробное десятичное) число, записанное в
строковом виде.
Например,
StrToFloatNew('32fd12,,d52,ds36') выведет
'3212,5236';
StrToFloatNew('-8-5d2a12,s4,5e2,2') выведет
'-8,521245E26'.
Примечание. В последнем примере число
'-85212,45E22' преобразовалось в нормальную
экспоненциальную форму '-8,521245E26'
(путем переноса запятой влево и увеличением степени).
|