![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с DecimalSeporator.
Kolan © (2006-07-27 20:52:00)Здраствуйте,
Как полностьюобезопасить приложение от ошибок, которые могут возникнуть при разных значениях DecimalSeparator. Те что нужно запомнить, (как писать) чтобы избежать любыхошибок связаных с ним.
Пусть приложение выполняет всевозможные работы с числами с пл. точкой.
Т.е. хотелось бы получить аналог:
var
Object: TObject;
begin
Object := TObject.Create;
try
finally
Object.Free;
end;
end;
Этот ког гарантирует удаление объекта, а я хочу подобное правило но для DS.
PS
А то вечер убил сегодня....
PPS
Понятно что бездумно писать ничего не буду...
Reindeer Moss Eater (2006-07-27 23:28:00) [1]В общем случае задача нерешаема.
Вот к примеру приехала к вам строка '33,333'
Как понять, что это?
То ли это дробное 33.333 из системы где запятая - decimal separator, то ли это целое 33333 с компьютера где запятая - разделитель тысяч.
А есть комбинации еще и покудрявее этой.
Пусик (2006-07-27 23:19:00) [2]
> Kolan © (27.07.06 23:14) [13]
> И ты всегда такие циклы делаешь???
Нет, конечно.
У меня обычно может возникнуть только 2 варианта - точка и запятая.
В таком случае проще воспользоваться StringReplace дважды, хотя с циклом вроде как должно быть оптимальнее.
s := StrinReplace(s,'.',DecimalSeparator,[]);
s := StrinReplace(s,',',DecimalSeparator,[]);
KilkennyCat (2006-07-27 23:17:00) [3]> [9] Пусик © (27.07.06 22:42)
А Replace чем плох?
Kolan (2006-07-27 23:14:00) [4]И ты всегда такие циклы делаешь???
Пусик (2006-07-27 22:52:00) [5]
> Kolan © (27.07.06 22:48) [11]
Число может быть получено не только от пользователя и в этой версии ОС, но и с другого компьютера(например, из текстового файла, ini-файла), просто из другой программы. В этом случае невозможно будет гарантировать, что разделительем является именно точка или запятая в числе. Им вполне может быть знак "=" или '-'.
Kolan (2006-07-27 22:48:00) [6]
> Пусик © (27.07.06 22:42) [9]
Угу тоже вариант, но цикл крутить.... В любом случае благодарю.
Kolan (2006-07-27 22:47:00) [7]Еще раз повторюсь. Я хотл бы организовать такую проверку, которая бы позволила нормально конвертировать флоат число при любом разделителе...
Вот этот код в Str положит строку с указаным разделителем(в данном случае '.'):
const
CFormatSettings:TFormatSettings=(DecimalSeparator:'.');
Str:=FloatToStr(Value,CFormatSettings);
Теперь чтобы правильно сконвертировать число:
CFormatSettings- сделал переменной, и при чтении:
{Получаю разделитель в системе}
CFormatSettings.DecimalSeparator := DecimalSeparator;
{При преобразовании использую его}
Value := StrToFloat(Edit1.Text, CFormatSettings);
Вроде работает. Правильно ли это решение?
Пусик (2006-07-27 22:42:00) [8]
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 21:46:00) [9]
> Галинка © (27.07.06 21:44) [7]
DecimalSeparator := ',';
Так что - ли?
Галинка (2006-07-27 21:44:00) [10]Некоторое время назад ьыла тема, что можно принудительно заставить приложение принимать любой децималсепаратор как точку или запятую. Т.е привести к единому )))
Kolan (2006-07-27 21:14:00) [11]
> TryStrToFloat
Угу понятно, осталось только добавить, и если TryStrToFloat вернет ложь нужно...
те:
var
S: string;
Val: Double;
begin
S := '1,222';
if not TryStrToFloat(S, Val) then
{...}
end;
Джо (2006-07-27 21:07:00) [12]> [4] Джо © (27.07.06 21:06)
Это я автору.
Dmitrij_K (2006-07-27 21:06:00) [13]Когда строку переводишь в число проверять надо и сообщать юзверю
Try
Except
end
или
TryStrToFloat
Джо (2006-07-27 21:06:00) [14]TryStrToFloatпозволяет убедиться в том, что в строке содержится корректное значение. Что еще имеется в виду под "обезопасить приложение от ошибок, которые могут возникнуть при разных значениях DecimalSeparator" я, честно говоря, не понял.
Kolan (2006-07-27 21:04:00) [15]Нет.
Пример программа считывает число из инишки: 2,23. Все ок....
А на др компеDS='.'. В результате Invalid floating point value....
Хотелось бы раз и на всегда пистать в таком стиле, чтобы все работало верно вне зависимости от DS....
Степан (2006-07-27 20:59:00) [16]Что я не понял... а что ты собрался удалять?! DecimalSeparator?!?!