Форум: "Начинающим";
Текущий архив: 2011.02.13;
Скачать: [xml.tar.bz2];
ВнизДесятичный разделитель Найти похожие ветки
← →
kta52 (2010-11-21 17:22) [0]Здравствуйте! Подскажите пожалуйста, как программно получать информацию о том, какой десятичный разделитель действует на компьютере, используемом в данный момент?
← →
Anatoly Podgoretsky © (2010-11-21 17:28) [1]> kta52 (21.11.2010 17:22:00) [0]
Переведи на английский десятичный разделитель
← →
Palladin © (2010-11-21 17:31) [2]52 это:
1 год рождения
2 возврастств
3 iq
?
← →
Anatoly Podgoretsky © (2010-11-21 17:35) [3]5.2
← →
v_a_belousov (2010-11-21 17:45) [4]
> ак программно получать информацию о том, какой десятичный
> разделитель действует на компьютере, используемом в данный
> момент?
DecimalSeparator в SySUtils
← →
v_a_belousov (2010-11-21 17:53) [5]Изменить разделитель можно так
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;
← →
Юрий Зотов © (2010-11-21 18:42) [6]
> v_a_belousov (21.11.10 17:53) [5]
Менять установки системы - не надо, юзер выставил их так, как надо ЕМУ.
А изменить разделитель внутри самой программы можно без всех этих ухищрений - простым присваиванием.
← →
Anatoly Podgoretsky © (2010-11-21 18:47) [7]> Юрий Зотов (21.11.2010 18:42:06) [6]
И изменять не требуется, большинство функций подерживают FormatSettings
← →
kta52 (2010-11-21 18:55) [8]v_a_belousov, спасибо, но мне нужно немного не это.
Если на компьютере
разделителем является точка, а введена запятая или
разделителем является запятая, а введена точка,
то надо, чтобы программа сразу писала в stringGrid правильный разделитель
← →
clickmaker © (2010-11-21 19:51) [9]> разделителем является точка, а введена запятая или
> разделителем является запятая, а введена точка
StringReplace(StringReplace(S, ",", DecimalSeparator), ".", DecimalSeparator)
← →
kta52 (2010-11-21 20:12) [10]спасибо
← →
Германн © (2010-11-22 02:08) [11]
> v_a_belousov (21.11.10 17:53) [5]
>
> Изменить разделитель можно так
>
>
Никогда так не нужно делать.
← →
Inovet © (2010-11-22 04:19) [12]> [2] Palladin © (21.11.10 17:31)
> 52 это:
> 1 год рождения
> 2 возврастств
> 3 iq
4. Коэффициент теплового апокалипсиса.
> [8] kta52 (21.11.10 18:55)
> Если на компьютере
> разделителем является точка, а введена запятая или
> разделителем является запятая, а введена точка,
> то надо, чтобы программа сразу писала в stringGrid правильный разделитель
Числа надо хранить как числа, выводить в интерфейсе пользователя в соответсвии с настройками системы, вводить тоже в соответсвии. Не будет путаницы и неразберихи. Как в Ексел, например, делается?
← →
Anatoly Podgoretsky © (2010-11-22 08:48) [13]> Inovet (22.11.2010 04:19:12) [12]
stringGrid хранит только строки.
← →
DiamondShark © (2010-11-22 13:17) [14]
> Числа надо хранить как числа, выводить в интерфейсе пользователя
> в соответсвии с настройками системы, вводить тоже в соответсвии.
Вот есть такая кнопочка на нумпаде. С точечкой.
В разных раскладках клавиатуры она вводит разный символ.
> Как в Ексел, например, делается?
Точка и запятая, введённые с основного поля вводятся без преобразования.
Точечка с нумпада преобразуется в десятичный разделитель.
← →
Anatoly Podgoretsky © (2010-11-22 13:42) [15]> DiamondShark (22.11.2010 13:17:14) [14]
А должны вводиться ,. в зависимости от языка, это стандартное поведение
системы.
← →
DiamondShark © (2010-11-22 15:38) [16]
> Anatoly Podgoretsky © (22.11.10 13:42) [15]
Тут вот какое дело.
Есть несколько сущностей:
- Локаль системы
- Локаль приложения (точнее, текущая локаль уишного потока)
- Пользовательские перекрытия системной/текущей локали
- текущий язык ввода
- текущая раскладка клавиатуры
Это всё хозяйство друг от друга не зависит и может быть, вообще говоря, установлено во все возможные сочетания.
Теперь вопрос:
- Системная локаль EN-US
- текущая локаль RU-RU
- Пользователь перекрыл настройки десятичного разделителя на символ "="
- текущий язык ввода -- Мумбо-Юмбо, в этом языке десятичный разделитель символ "@"
- текущая раскладка клавиатуры Мумбо-Юмбо-Клинопись, в которой цифровая клавиша с точкой транслируется в символ "<".
Какой символ должен появиться в поле ввода при нажатии на цифровую клавишу "точка"?
Символы "," и "." являются, как легко заметить, являются наименее адекватным вариантом.
Более того, адекватный вариант вообще невозможно выбрать БЕЗ УЧЁТА ЛОГИКИ ПРИЛОЖЕНИЯ.
Самый адекватный вариант такой:
- Если поле ввода подразумевает ввод числовых данных, то вводиться должен числовой разделитель, определяемый текущей модифицированной локалью. Т.е., в нашем случае, символ "="
- Если поле ввода подразумевает ввод произвольного текста, то вводиться должен символ текущей клавиатурной раскладки. Т.е., в нашем случае, символ "<"
← →
Inovet © (2010-11-22 15:42) [17]> [13] Anatoly Podgoretsky © (22.11.10 08:48)
> stringGrid хранит только строки.
> [8] kta52 (21.11.10 18:55)
> надо, чтобы программа сразу писала в stringGrid правильный разделитель
Хранить не StringGrid.
← →
Anatoly Podgoretsky © (2010-11-22 15:50) [18]> DiamondShark (22.11.2010 15:38:16) [16]
Текущая локаль, именно так это работает в системе и я не ожидаю другого
поведения в других программах.
← →
Inovet © (2010-11-22 15:52) [19]> [14] DiamondShark © (22.11.10 13:17)
> Точечка с нумпада преобразуется в десятичный разделитель.
Ну вот, она в момент ввода отлавливается, а пользователь видит то, что в системе выставлено. С реплейсом же будет вводить точку, а она превратится в запятую, А если ещё автор сохранит это всё как текст и откроет на другой машине с другим разделителем в настройках.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.02.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c