Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Десятичный разделитель [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]

Переведи на английский десятичный разделитель


Наверх

Титульная страница Поиск, карта сайта Написать письмо