Вниз
Скачать: CL | DM;

Работа с DecimalSeporator.   Найти похожие ветки 

← →
Kolan ©   (2006-07-27 20:52) [0]

Здраствуйте,
 Как полностью обезопасить приложение от ошибок, которые могут возникнуть при разных значениях DecimalSeparator. Те что нужно запомнить, (как писать) чтобы избежать любых ошибок связаных с ним.

Пусть приложение выполняет всевозможные работы с числами с пл. точкой.

Т.е. хотелось бы получить аналог:
var
 Object: TObject;
begin
 Object := TObject.Create;
 try
 finally
   Object.Free;
 end;
end;

Этот ког гарантирует удаление объекта, а я хочу подобное правило но для DS.

PS
 А то вечер убил сегодня....
PPS
 Понятно что бездумно писать ничего не буду...


← →
Степан   (2006-07-27 20:59) [1]

Что я не понял... а что ты собрался удалять?! DecimalSeparator?!?!


← →
Kolan ©   (2006-07-27 21:04) [2]

Нет.

Пример программа считывает число из инишки: 2,23. Все ок....

А на др компе DS=".". В результате Invalid floating point value....

Хотелось бы раз и на всегда пистать в таком стиле, чтобы все работало верно вне зависимости от DS....


← →
Dmitrij_K   (2006-07-27 21:06) [3]

Когда строку переводишь в число проверять надо и сообщать юзверю

Try
Except
end

или

TryStrToFloat


← →
Джо ©   (2006-07-27 21:06) [4]

TryStrToFloat позволяет убедиться в том, что в строке содержится корректное значение. Что еще имеется в виду под "обезопасить приложение от ошибок, которые могут возникнуть при разных значениях DecimalSeparator" я, честно говоря, не понял.


← →
Джо ©   (2006-07-27 21:07) [5]

> [4] Джо ©   (27.07.06 21:06)

Это я автору.


← →
Kolan ©   (2006-07-27 21:14) [6]


> TryStrToFloat

Угу понятно, осталось только добавить, и если TryStrToFloat вернет ложь нужно...

те:
var
 S: string;
 Val: Double;
begin
 S := "1,222";
 if not TryStrToFloat(S, Val) then
 {...}
end;


← →
Галинка ©   (2006-07-27 21:44) [7]

Некоторое время назад ьыла тема, что можно принудительно заставить приложение принимать любой децималсепаратор как точку или запятую. Т.е привести к единому )))


← →
Kolan ©   (2006-07-27 21:46) [8]


> Галинка ©   (27.07.06 21:44) [7]

DecimalSeparator := ",";
Так что - ли?


← →
Пусик ©   (2006-07-27 22:42) [9]

function ToDouble(const Src: String): Double;
var
 s: String;
 i: Integer;
begin
 s := Src;
 for i := 1 to Length(s) do
 begin
   if (s[i]<#48) or (s[i]>#57) then
   begin
     s[i] := DecimalSeparator;
     Break;
   end;
 end;
 Result := StrToFloat(s);
end;


← →
Kolan ©   (2006-07-27 22:47) [10]

Еще раз повторюсь. Я хотл бы организовать такую проверку, которая бы позволила нормально конвертировать флоат число при любом разделителе...

Вот этот код в Str положит строку с указаным разделителем(в данном случае "."):

const
 CFormatSettings:TFormatSettings=(DecimalSeparator:".");

Str:=FloatToStr(Value,CFormatSettings);


Теперь чтобы правильно сконвертировать число:

CFormatSettings - сделал переменной, и при чтении:


 {Получаю разделитель в системе}
 CFormatSettings.DecimalSeparator := DecimalSeparator;
 {При преобразовании использую его}
 Value := StrToFloat(Edit1.Text, CFormatSettings);


Вроде работает. Правильно ли это решение?


← →
Kolan ©   (2006-07-27 22:48) [11]


> Пусик ©   (27.07.06 22:42) [9]

Угу тоже вариант, но цикл крутить.... В любом случае благодарю.


← →
Пусик ©   (2006-07-27 22:52) [12]


> Kolan ©   (27.07.06 22:48) [11]


Число может быть получено не только от пользователя и в этой версии ОС, но и с другого компьютера(например, из текстового файла, ini-файла), просто из другой программы. В этом случае невозможно будет гарантировать, что разделительем является именно точка или запятая в числе. Им вполне может быть знак "=" или "-".


← →
Kolan ©   (2006-07-27 23:14) [13]

И ты всегда такие циклы делаешь???


← →
KilkennyCat ©   (2006-07-27 23:17) [14]

> [9] Пусик ©   (27.07.06 22:42)


А Replace чем плох?


← →
Пусик ©   (2006-07-27 23:19) [15]


> Kolan ©   (27.07.06 23:14) [13]
> И ты всегда такие циклы делаешь???


Нет, конечно.
У меня обычно может возникнуть только 2 варианта - точка и запятая.
В таком случае проще воспользоваться StringReplace дважды, хотя с циклом вроде как должно быть оптимальнее.

s := StrinReplace(s,".",DecimalSeparator,[]);
s := StrinReplace(s,",",DecimalSeparator,[]);


← →
Reindeer Moss Eater ©   (2006-07-27 23:28) [16]

В общем случае задача нерешаема.
Вот к примеру приехала к вам строка "33,333"
Как понять, что это?
То ли это дробное 33.333 из системы где запятая - decimal separator, то ли это целое 33333 с компьютера где запятая - разделитель тысяч.
А есть комбинации еще и покудрявее этой.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.028 c
15-1153971454
Nic
2006-07-27 07:37
2006.08.20
Вопросик по php


15-1153452702
Капитошка
2006-07-21 07:31
2006.08.20
Определение своего внешнего айпи-адреса


2-1154500051
alkin
2006-08-02 10:27
2006.08.20
Вопрос по базе данных


2-1154520955
Grant
2006-08-02 16:15
2006.08.20
Денежный разделитель


2-1154143749
Василий
2006-07-29 07:29
2006.08.20
Как пользоваться функцией GetWindowplacement?




   Наверх