powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FloatToStr и знак разделителя десятичной дроби в разных системах
25 сообщений из 131, страница 1 из 6
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697031
Есть программа, хорошо работает. Переношу экзешник на другую систему - не работает. Долго и занудно искал ошибку, нашел:
В одной системе FloatToStr преобразует текст с запятой в число без проблем, а в другой выдаёт ошибку автор'-0,59' is not a valid floating point value
Если менять заменять точку при считывании - во второй системе всё работает, в первой нет - как это можно аккуратно обыграть (ну я понимаю, что можно через костыль, типа в случае ошибки считывания менять одно на другое и считывать заново, но костыли - зло), наверняка есть способ попроще.

А вообще, что удивительно, до определённого момента всё работало на обеих системах, а потом хоп и перестало (знак разделителя в системе сам не менял, но комп рабочий, может админы чего намудрили).
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697032
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

FormatSettings
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697125
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичВ одной системе FloatToStr преобразует текст с запятой в число без проблем

FloatToStr годится только для строк, которые вводит пользователь в соответствии с его
пользовательскими настройками. Если ты откуда-то берёшь строку фиксированного формата, то
к ней надо применять функции преобразования с фиксированным форматом. Например, Val().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697145
DarkMaster,

Спасибо:
Код: pascal
1.
FormatSettings.DecimalSeparator:='.';
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697146
Андрей Игоревич,

Точнее наоборот
Код: pascal
1.
FormatSettings.DecimalSeparator:=',';
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697153
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичТочнее наоборот

нужно сделать 2 варианта замены
Андрей ИгоревичFloatToStr преобразует текст с запятой в число без проблем, а в другой выдаёт ошибку

Код: pascal
1.
2.
  val := StringReplace(val, ',', FormatSettings.DecimalSeparator, []);
  val := StringReplace(val, '.', FormatSettings.DecimalSeparator, []);



т.е. чтобы не гадать, что там у пользователя, можно и точку, и запятую заменить на "FormatSettings.DecimalSeparator"
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697156
X11,

Спасибо, так и сделаю.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697162
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11нужно сделать 2 варианта заменыНе нужно. Если данные формируются в этой системе, то используем дефолтный разделитель. Если приходят снаружи, то используем разделитель согласно протокола
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697233
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11нужно сделать 2 варианта замены
Код: pascal
1.
2.
  val := StringReplace(val, ',', FormatSettings.DecimalSeparator, []);
  val := StringReplace(val, '.', FormatSettings.DecimalSeparator, []);



т.е. чтобы не гадать, что там у пользователя, можно и точку, и запятую заменить на "FormatSettings.DecimalSeparator"
Борланд научил плохому, а все и рады потакать дурным привычкам. FormatSettings как глобальную переменную надо избегать всеми силами кроме тех случаев, когда она используется по назначению - как текущие региональные настройки. Да и то, глобальная переменная - зло, и более правильно TFormatSettings.Create('') непосредственно перед применением.
Потому как:
1) Некая библиотека глубоко внутри себя сменила DecimalSeparator на что-то свое, и не вернула прежнее значение.
1.1) Некая библиотека глубоко внутри себя сменила DecimalSeparator на что-то свое, и не успела вернуть прежнее значение, как из другого потока выполняется обращение к этому полю
2) Программа запущена, юзер сменил региональные настройки. FormatSettings содержит старые значения.
и т.д.

В общем, я советую так (к чему пришел на своем опыте):
1) Float/DateToStr, Format без параметра типа TFormatSettings - только для отображения, да и то осмысленно
2) Во всех остальных случаях - фиксированный экземпляр TFormatSettings, с жестко прописанными полями. В качестве основы можно взять, например, LOCALE_INVARIANT.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697245
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичАндрей Игоревич,

Точнее наоборот
Код: pascal
1.
FormatSettings.DecimalSeparator:=',';



Когда пользуетесь настройкой глобального FormatSettings не забывайте о:

Код: pascal
1.
Application.UpdateFormatSettings:=False;



А то вы рискуете огрести проблем.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697270
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_X11нужно сделать 2 варианта заменыНе нужно. Если данные формируются в этой системе, то используем дефолтный разделитель. Если приходят снаружи, то используем разделитель согласно протокола
У меня другие рекомендации
1. системные настройки формата использовать только для вывода на экран/конвертации пользовательского ввода
2. для файловых операций использовать стандартизованные (протокольные)
3. чтобы не было коллизий вспомнить про третий параметр функций.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697281
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatАндрей ИгоревичАндрей Игоревич,

Точнее наоборот
Код: pascal
1.
FormatSettings.DecimalSeparator:=',';



Когда пользуетесь настройкой глобального FormatSettings не забывайте о:

Код: pascal
1.
Application.UpdateFormatSettings:=False;



А то вы рискуете огрести проблем.
Она локальная, и стртуфлоат принимает вторым параметром.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697282
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

в нормальных делфях, естественно.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697316
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiОна локальная
Да ну?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
unit System.SysUtils;

<..>

var
  // Note: Using the global FormatSettings formatting variables is not thread-safe.
  FormatSettings: TFormatSettings;



JaDiи стртуфлоат принимает вторым параметром.FloatToStr и без 2-го параметра бывает.
Причем если проект разрабатывается нормально (без бардака), то проще использовать именно такой.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697330
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatJaDiи стртуфлоат принимает вторым параметром.FloatToStr и без 2-го параметра бывает.
Причем если проект разрабатывается нормально (без бардака), то проще использовать именно такой.
О да, результат использования без форматсеттинга прекрасно виден в этом самом топике.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697347
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiО да, результат использования без форматсеттинга прекрасно виден в этом самом топике.Трудно-ли умеючи? (с)
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697349
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

так-так, чуствую, далее пойдет предложение следить за компами пользователей и их настройками :D
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697352
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делай так.

Код: pascal
1.
2.
Application.UpdateFormatSettings:=False;
FormatSettings.DecimalSeparator:='.';



И можешь не следить.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697354
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но особо огороженные граждане могут каждый раз генерить свою копию FormatSettings.

Разрешаю.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697392
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНо особо огороженные граждане могут каждый раз генерить свою копию FormatSettings. Зачем каждый раз?
Одного экземпляра для всех файловых операций вполне достаточно. А переключение дефолтного рано или поздно непременно приведет к косякам. Например в многопоточном приложении.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697403
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисА переключение дефолтного рано или поздно непременно приведет к косякам. Например в многопоточном приложении.Зачем его вообще переключать?
Один раз выставил как надо при старте и радуйся.

Делать разные разделители в разных местах приложения - это либо явный bad design, либо исключение без которого никак не обойтись, но тут уже не зазорно и локальный TFormatSetting поюзать.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697428
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЗачем его вообще переключать? Затем, что в UI должны быть системные настройки, а в файле стандартизованные.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697435
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисrgreatЗачем его вообще переключать? Затем, что в UI должны быть системные настройки, а в файле стандартизованные.
Ой да ладно, "должны".
Мы во всех приложениях при старте выставляем единые настройки формата, а дальше пользуйся чем бог на душу положит, все равно десятичный разделитель - всегда точка, а дата - всегда только вот в таких форматах, невзирая на системные настройки, и никто никогда ни разу не жаловался, а наоборот. Может быть, когда начнем англичанам софт продавать, формат даты будем системный использовать, а в России и так сойдет.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697436
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисЗатем, что в UI должны быть системные настройкиНефиг.
Как минимум не в корпоративном ПО.
...
Рейтинг: 0 / 0
FloatToStr и знак разделителя десятичной дроби в разных системах
    #39697437
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разделитель целого и дробного - "точка" и баста!
...
Рейтинг: 0 / 0
25 сообщений из 131, страница 1 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FloatToStr и знак разделителя десятичной дроби в разных системах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]