![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Float To Str & Decimal Separator
@!!ex © (2007-10-22 19:05:00)Есть проект.
Одна из важнейших его задач - разбор текстового скрипта.
Все работает... Но тут возникла неприятная проблема.
На некоторых компьютерах вылетает эксцепшн вида:
"'1000,0' is not a valid floating point value"
Как я понял, это связано с установленным в винде Decimal Separator'ом.
Но ничего толкового в справке не нашел.
Вопрос, как можно это исправить?
@!!ex (2007-10-23 11:42:00) [21]> [17] umbra © (23.10.07 11:40)
Ок. Значит в [5] как раз то что нужно.. Спасибо!
umbra (2007-10-23 11:40:00) [22]
> А вариант предложенный в [5] чем плох?
>
влияет на все потоки приложения. АFormatSettingsможно сделать несколько штук и пользоваться по мере надобности разными в разных потоках.
@!!ex (2007-10-23 11:35:00) [23]> [15] KSergey © (23.10.07 11:02)
Нет-нет. Я же писал, текст стабильный, всегда с запятой.
> [14] Однокамушкин (23.10.07 08:49)
Этот вариант подразумевает переписывание всего кода, что не есть гут. :(
А вариант предложенный в [5] чем плох?
KSergey (2007-10-23 11:02:00) [24]> Однокамушкин (23.10.07 08:49) [14]
Я не понимаю как это будет работать.
У него же - как я понял - извне приходящий текст, с котором не известно - точка или запятая.
Однокамушкин (2007-10-23 08:49:00) [25]
var
FormatSettings: TFormatSettings;
// Это делается один раз где-то в начале программы
GetLocaleFormatSettings(0, FormatSettings);
FormatSettings.DecimalSeparator := ',';
// Для преобразования используем перекрытый вариант StrToFloat
X := StrToFloat(S, FormatSettings);
Это позволяет делать правильные преобразования, не влияя на остальные части программы, как это будет в случае использования глобальной переменной DecimalSeparator
korneley (2007-10-23 08:24:00) [26]
> а не анилизирует его
Не удержался от флейма... Это от Nil?
Skyle (2007-10-23 06:56:00) [27]> DevilDevil (22.10.07 19:28) [5]
> Jump (22.10.07 19:07) [1]
> vpbar © (22.10.07 19:18) [3]
Отстреливал бы за такие советы. Особенно в данной конференции.
Anatoly Podgoretsky (2007-10-22 20:15:00) [28]Ошибка в заголовке или как?
@!!ex (2007-10-22 20:11:00) [29]> [9] Anatoly Podgoretsky © (22.10.07 20:10)
Ааа. Ну да...
Сорри, туплю... Не то написал...
Anatoly Podgoretsky (2007-10-22 20:10:00) [30]> @!!ex (22.10.2007 20:05:08) [8]
Потому что, FloatToStr вставляет разделитель, который указан в переменной, а не анилизирует его, поскольку Float нет никаких разделителей, а вот наоброт StrToFloat такую ошибку может дать.
@!!ex (2007-10-22 20:05:00) [31]
> [2] Anatoly Podgoretsky © (22.10.07 19:14)
Почему?
> [7] engine © (22.10.07 19:32)
Структура скрипта фиксированная и не подразумевает использование точки в качестве разделителя.
engine (2007-10-22 19:32:00) [32]> [5] DevilDevil (22.10.07 19:28)
до тех пор, пока не вылезет
«'1000.0' is not a valid floating point value»
:)
vpbar (2007-10-22 19:32:00) [33]Да. Если формат чисел в скриптах известен, то быстее как сказано [5].
DevilDevil (2007-10-22 19:28:00) [34]проблема преобразования
FloatToStr/StrToFloat.
//MainFormOnCreate
DecimalSeparator := ',' ;
Теперь преобразования будут происходить относительно запятой независимо от компьютера.
Правильный_Вася (2007-10-22 19:27:00) [35]
> Меняй все точки и запятые на текущий DecimalSeparator.
а если будет стоять разделитель тысяч?
vpbar (2007-10-22 19:18:00) [36]да. скорее всего ошибка в заголовке.
Меняй все точки и запятые на текущий DecimalSeparator.
Anatoly Podgoretsky (2007-10-22 19:14:00) [37]> @!!ex (22.10.2007 19:05:00) [0]
Для данной функции эта ошибка вылетать не может.
Jump (2007-10-22 19:07:00) [38]Сменить DecimalSeparator?