Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: 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 вся ветка

Текущий архив: 2006.08.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.054 c
15-1153988631
PSPF2003
2006-07-27 12:23
2006.08.20
Китай готов взять в Сибири в аренду 1 млн га леса


2-1154009086
Ega23
2006-07-27 18:04
2006.08.20
Визуализация длительной загрузки


6-1144044251
zsv
2006-04-03 10:04
2006.08.20
Подключение к интернет


15-1153989001
Alert2006
2006-07-27 12:30
2006.08.20
Координаты


2-1154501900
Arsenija
2006-08-02 10:58
2006.08.20
обработка по нажатии ENTER в LabeledEdit