Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизРабота с 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c