Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.13;
Скачать: CL | DM;

Вниз

Десятичный разделитель   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
15-1288350110
Очень злой
2010-10-29 15:01
2011.02.13
Установка программ через групповую политику active directory


15-1288338243
Vlad_MK
2010-10-29 11:44
2011.02.13
Посоветуйте генератор отчетов


2-1290501543
mem
2010-11-23 11:39
2011.02.13
как строится индекс?


15-1288635282
boriskb
2010-11-01 21:14
2011.02.13
Microsoft открывает центр разработок в Сколково


13-1126698314
ilya39
2005-09-14 15:45
2011.02.13
Взаимодействие потоков в C#