![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Десятичный разделитель [D7, XP]
kta52 © (2010-11-21 17:22:00)Здравствуйте! Подскажите пожалуйста, как программно получать информацию о том, какой десятичный разделитель действует на компьютере, используемом в данный момент?
Inovet (2010-11-22 15:52:00) [1]> [14] DiamondShark © (22.11.10 13:17)
> Точечка с нумпада преобразуется в десятичный разделитель.
Ну вот, она в момент ввода отлавливается, а пользователь видит то, что в системе выставлено. С реплейсом же будет вводить точку, а она превратится в запятую, А если ещё автор сохранит это всё как текст и откроет на другой машине с другим разделителем в настройках.
Anatoly Podgoretsky (2010-11-22 15:50:00) [2]> DiamondShark (22.11.2010 15:38:16) [16]
Текущая локаль, именно так это работает в системе и я не ожидаю другого
поведения в других программах.
Inovet (2010-11-22 15:42:00) [3]> [13] Anatoly Podgoretsky © (22.11.10 08:48)
> stringGrid хранит только строки.
> [8] kta52 (21.11.10 18:55)
> надо, чтобы программа сразу писала в stringGrid правильный разделитель
Хранить не StringGrid.
DiamondShark (2010-11-22 15:38:00) [4]
> Anatoly Podgoretsky © (22.11.10 13:42) [15]
Тут вот какое дело.
Есть несколько сущностей:
- Локаль системы
- Локаль приложения (точнее, текущая локаль уишного потока)
- Пользовательские перекрытия системной/текущей локали
- текущий язык ввода
- текущая раскладка клавиатуры
Это всё хозяйство друг от друга не зависит и может быть, вообще говоря, установлено во все возможные сочетания.
Теперь вопрос:
- Системная локаль EN-US
- текущая локаль RU-RU
- Пользователь перекрыл настройки десятичного разделителя на символ "="
- текущий язык ввода -- Мумбо-Юмбо, в этом языке десятичный разделитель символ "@"
- текущая раскладка клавиатуры Мумбо-Юмбо-Клинопись, в которой цифровая клавиша с точкой транслируется в символ "<".
Какой символ должен появиться в поле ввода при нажатии на цифровую клавишу "точка"?
Символы "," и "." являются, как легко заметить, являются наименее адекватным вариантом.
Более того, адекватный вариант вообще невозможно выбрать БЕЗ УЧЁТА ЛОГИКИ ПРИЛОЖЕНИЯ.
Самый адекватный вариант такой:
- Если поле ввода подразумевает ввод числовых данных, то вводиться должен числовой разделитель, определяемый текущей модифицированной локалью. Т.е., в нашем случае, символ "="
- Если поле ввода подразумевает ввод произвольного текста, то вводиться должен символ текущей клавиатурной раскладки. Т.е., в нашем случае, символ "<"
Anatoly Podgoretsky (2010-11-22 13:42:00) [5]> DiamondShark (22.11.2010 13:17:14) [14]
А должны вводиться ,. в зависимости от языка, это стандартное поведение
системы.
DiamondShark (2010-11-22 13:17:00) [6]
> Числа надо хранить как числа, выводить в интерфейсе пользователя
> в соответсвии с настройками системы, вводить тоже в соответсвии.
Вот есть такая кнопочка на нумпаде. С точечкой.
В разных раскладках клавиатуры она вводит разный символ.
> Как в Ексел, например, делается?
Точка и запятая, введённые с основного поля вводятся без преобразования.
Точечка с нумпада преобразуется в десятичный разделитель.
Anatoly Podgoretsky (2010-11-22 08:48:00) [7]> Inovet (22.11.2010 04:19:12) [12]
stringGrid хранит только строки.
Inovet (2010-11-22 04:19:00) [8]> [2] Palladin © (21.11.10 17:31)
> 52 это:
> 1 год рождения
> 2 возврастств
> 3 iq
4. Коэффициент теплового апокалипсиса.
> [8] kta52 (21.11.10 18:55)
> Если на компьютере
> разделителем является точка, а введена запятая или
> разделителем является запятая, а введена точка,
> то надо, чтобы программа сразу писала в stringGrid правильный разделитель
Числа надо хранить как числа, выводить в интерфейсе пользователя в соответсвии с настройками системы, вводить тоже в соответсвии. Не будет путаницы и неразберихи. Как в Ексел, например, делается?
Германн (2010-11-22 02:08:00) [9]
> v_a_belousov (21.11.10 17:53) [5]
>
> Изменить разделитель можно так
>
>
Никогда так не нужноделать.
kta52 (2010-11-21 20:12:00) [10]спасибо
clickmaker (2010-11-21 19:51:00) [11]> разделителем является точка, а введена запятая или
> разделителем является запятая, а введена точка
StringReplace(StringReplace(S, ',', DecimalSeparator), '.', DecimalSeparator)
kta52 (2010-11-21 18:55:00) [12]v_a_belousov, спасибо, но мне нужно немного не это.
Если на компьютере
разделителем является точка, а введена запятая или
разделителем является запятая, а введена точка,
то надо, чтобы программа сразу писала в stringGrid правильный разделитель
Anatoly Podgoretsky (2010-11-21 18:47:00) [13]> Юрий Зотов (21.11.2010 18:42:06) [6]
И изменять не требуется, большинство функций подерживают FormatSettings
Юрий Зотов (2010-11-21 18:42:00) [14]
> v_a_belousov (21.11.10 17:53) [5]
Менять установки системы - не надо, юзер выставил их так, как надо ЕМУ.
А изменить разделитель внутри самой программы можно без всех этих ухищрений - простым присваиванием.
v_a_belousov (2010-11-21 17:53:00) [15]Изменить разделитель можно так
procedure SetDecimalSeparator( Ch: Char );
var
DefLCID: LCID;
Buffer: LPSTR;
begin
Application.UpdateFormatSettings := true;
StrPCopy( Buffer, Ch );
DefLCID := GetThreadLocale;
if SetLocaleInfo( DefLCID, LOCALE_SDECIMAL, Buffer ) then
DecimalSeparator := StrPas( Buffer )[1];
Application.UpdateFormatSettings := false;
end;
Например....
procedure TForm1.Button1Click(Sender: TObject);
begin
SetDecimalSeparator( '.' );
end;
v_a_belousov (2010-11-21 17:45:00) [16]
> ак программно получать информацию о том, какой десятичный
> разделитель действует на компьютере, используемом в данный
> момент?
DecimalSeparator в SySUtils
Anatoly Podgoretsky (2010-11-21 17:35:00) [17]5.2
Palladin (2010-11-21 17:31:00) [18]52 это:
1 год рождения
2 возврастств
3 iq
?
Anatoly Podgoretsky (2010-11-21 17:28:00) [19]> kta52 (21.11.2010 17:22:00) [0]
Переведи на английский десятичный разделитель