Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.045 c
15-1153951037
SergProger
2006-07-27 01:57
2006.08.20
E-mail и PHP


2-1154595222
GEM
2006-08-03 12:53
2006.08.20
Не могу написать запросы. Нужна помощь


2-1154156127
Fosgen
2006-07-29 10:55
2006.08.20
Создание массива констант из указателей method pointers


1-1152189271
kyn66
2006-07-06 16:34
2006.08.20
Запуск файла картинки


6-1143505652
Sergio77
2006-03-28 04:27
2006.08.20
Запрет доступа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский