| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как переключить разделитель целой и дробной части?

Как переключить разделитель целой и дробной части?

Ответ
Поиск в этой теме
Непрочитано 14.11.2008, 15:31
Как переключить разделитель целой и дробной части?
Baldares
 
Саратов
Регистрация: 17.10.2008
Сообщений: 426

Привет.

Зла нехватает, с этими бюррократами

Короче ставлю "," ручками в Языках и Стандартах Виндов. А с нумпада опять точка вводится, и не воспринимается как число.

Что за х?
Просмотров: 13496
 
Непрочитано 14.11.2008, 23:51
#21
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Разделитель целой и дробной части хранится в реестре, насколько мне помнится.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.11.2008, 08:07
#22
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


В своей программе совсем не обязательно, чтобы автоматически учитывались региональные настройки. Это зависит от используемых компонентов и мозгов программиста. А с мозгами "в стране напряженка". Поэтому программисты часто уверены, что у всех DECIMAL_SEPARATOR должен быть установлен, как и у них.

В хороших программах это обязательно учитывается. В момент ввода данных и в моменты преобразования для вычислений и для вывода на экран. Хороший компонент также не даст ввести неправильный разделитель в момент ввода числа. Это у хорошего компонета "в мозги зашито".

Если нет хорошего компонента, должны включаться мозги программиста для вставки в обработчик событий дополнительного кода по преобразованию данных.

В реестр лазить не надо, необходимо обращаться к функциям API, так как место хранения сепаратора может изменяться.
ShaggyDoc вне форума  
 
Непрочитано 17.11.2008, 10:54
#23
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Думается мне, что дело тут не в мозгах, а всего лишь в отсутствии опыта.
А все, что подобает сделать опытному старшему товарищу - это привести короткий исчерпывающий пример кода, в котором грамотно "разруливается" подобная ситуация. Многим пригодилось бы (и мне в том числе).
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 17.11.2008, 11:32
#24
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Например, так (на Pascal):

Код:
[Выделить все]
 
function strUStofloat(value: string): double;
var
  OldSeparator: char;
begin
  result := 0;
  OldSeparator := DecimalSeparator;
  DecimalSeparator := '.';
  try
    result := StrToFloat(value);
  except
    //
  end;
  DecimalSeparator := OldSeparator;
end;
Здесь StrToFloat - штатная функция, которая "любит" разделитель, указанный в DecimalSeparator.

DecimalSeparator - глобальная переменная Windows. Она временно переопределяется на точку, получаем правильное число штатной функцией. Возможно и противоположное применение, например

Код:
[Выделить все]
 
function strRUStofloat(value: string): double;
var
  OldSeparator: char;
begin
  result := 0;
  OldSeparator := DecimalSeparator;
  DecimalSeparator := ',';
  try
    result := StrToFloat(value);
  except
    //
  end;
  DecimalSeparator := OldSeparator;
end;
А какую применять - зависит от используемых компонентов. Их можно настроить на разные DecimalSeparator. Причем лучше, если это будет именно "американская" точка, так как за много лет люди привыкли, что в большинстве программ надо именно точку вводить.

Для вывода данных на печать используются подобные функции, только заменяющие разделитель на нужный.

Хорошо, если в программе есть возможность для пользователя настроить, что использовать - "точку", "запятую" или "из региональных настроек".

Тогда в могло бы быть наподобие

Код:
[Выделить все]
 
function MyStrToFloat(value: string): double;
var
  OldSeparator: char;
begin
  result := 0;
  OldSeparator := DecimalSeparator;
  DecimalSeparator := MyDecimalSeparator();
  try
    result := StrToFloat(value);
  except
    //
  end;
  DecimalSeparator := OldSeparator;
end;
MyDecimalSeparator - функция, возвращающая из настроек программы разделитель.

В каждую программу это пихать не надо, это может быть в одном модуле, а в программе, вместо StrToFloat использовать MyStrToFloat.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 21.11.2008, 11:45
#25
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Невъехал как #24 применить в "гребаном" VBA.
Вот помогло это:
Замена точки или запятой в строке на разделитель установленный в реестре.
Код:
[Выделить все]
Public Function ReplaceDelimiter(InputStr As String) As String
   Dim WSHShell As Object
   Set WSHShell = CreateObject("WScript.Shell")
   InputStr = Replace(InputStr, ".", WSHShell.RegRead("HKEY_CURRENT_USER\Control Panel\International\sDecimal"))
   InputStr = Replace(InputStr, ",", WSHShell.RegRead("HKEY_CURRENT_USER\Control Panel\International\sDecimal"))
   ReplaceDelimiter = InputStr
End Function
Вредоносность оценить не могу.

Последний раз редактировалось Baldares, 21.11.2008 в 12:05.
Baldares вне форума  
 
Автор темы   Непрочитано 21.11.2008, 11:57
#26
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Упс! А чето не найду сам References Windows Script Host Object Model. Ведь должон быть!?
Baldares вне форума  
 
Непрочитано 21.11.2008, 14:15
#27
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


У путёвого админа непременно стоит запрет на запуск Windows Script Host - распахнутых настежь ворот для атак на компьютер. Зачем из-за такой ерунды всё это запускать?

Одно из достоинств (самое большое) этого "гребаного" (по твоему выражению) в том, что из него можно вызывать функции обычных dll, в том числе WinAPI. Ну уж и реестр-то наверняка напрямую читать умеет, без всяких шеллов.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 21.11.2008, 15:03
#28
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


ShaggyDoc, махнемся головами не глядя!
Baldares вне форума  
 
Непрочитано 21.11.2008, 15:54
#29
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Что умеет без Shell - это да. Но "напрямую" - это вряд ли
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как переключить разделитель целой и дробной части?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41