Страницы: 1
RSS
Разделитель десятичных знаков. Баг или так и должно быть?, Откуда берется символ разделителя десятичных знаков
 
Форумчане, добрый день.


Столкнулся с проблемой при попытке сделать макрос невосприимчивым к системному разделителю десятичных знаков.
Заметил, что результат выражения "Application.DecimalSeparator" и системные настройки разделителя десятичных знаков различаются (при этом "Application.UseSystemSeparators = True").

Немного попереключал флажки и получил следующие результаты в окне Immediate (системные настройки разделителя всегда ","):
1.
Код
? Application.DecimalSeparator 
,
При




2.
Код
? application.DecimalSeparator
.

При




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

То есть получается, что разделитель дробной части игнорирует значения флажка "Использовать системные разделите" и использует значение из "серенького окошка" (разделитель  целой и дробной части). Так должно быть? Или неправильные запросы делаю?

И другой вопрос: как в коде лучше прописать, чтобы код работал вне зависимости от системных настроек:
так?
Код
Application.UseSystemSeparators = False
Application.DecimalSeparator = ","
Изменено: AlbertSF - 21.11.2019 15:04:09
 
AlbertSF, здравствуйте!
Прикрепите картинки нормально, а то сейчас вот так…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, не сразу разобрался как это сделать. В превью нормальные картинки отображались.
 
Цитата
AlbertSF: как в коде лучше прописать, чтобы код работал вне зависимости от системных настроек
на практике не приходилось, но я бы создавал в коде переменную DecSep$=Application.DecimalSeparator. Можно вообще обойтись без переменной и обращаться напрямую Application.DecimalSeparator, просто так больше писанины…
Проблемы вообще не вижу - может вопрос не понял))
Изменено: Jack Famous - 21.11.2019 15:25:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, у нас на работе на большинстве компьютеров по умолчанию следующие настройки: стоит галочка использовать системный разделитель, а в "сереньком окошке" разделитель целой и дробной части "." (точка).

В коде есть кусок, который получает данные с интернета (координаты) вида "50.000000". Мне необходимо их обрабатывать. Для этого создал переменную типа Double и присваиваю ей значение через:
Код
Переменная = replace(Координата, ".", Application.DecimalSeparator)

Так как Application.DecimalSeparator определяется как точка (см. первый пост), то возникает ошибка типа данных. Система не обрабатывает тип Double с разделителем точкой, так как в системных настройках установлена запятая.

Вопрос, в целом, в том, что невозможно полноценно (в моем понимании) использовать конструкцию "Application.DecimalSeparator", так как при включенном флажке системных настроек, Application.DecimalSeparator не равно системным настройкам.
 
Цитата
AlbertSF написал:
как в коде лучше прописать, чтобы код работал вне зависимости от системных настроек
Идея менять макросом свойства Application может сильно не понравиться владельцу компьютера, на котором будет выполняться Ваш макрос. Вы должны свой код макроса написать так, чтобы он корректно выполнялся во всех случаях. Узнать текущий десятичный разделитель можно как в #4, или по рабоче-крестьянски:
Код
Debug.Print Mid(1 / 2, 2, 1)
Владимир
 
Цитата
AlbertSF: стоит галочка использовать системный разделитель, а в "сереньком окошке" разделитель целой и дробной части "." (точка)
а — вон оно чё. Человеческий фактор, стало быть  :D

Ну тогда 2 варианта (как я вижу):
  • правильно — используем несколько проверок типа
If Application.UseSystemSeparators = True Then DecSep=Application.DecimalSeparator Else …
  • костыль —
Код
On Error Resume Next
Переменная = replace(Координата, ".", Application.DecimalSeparator)
If Err Then Переменная = replace(Координата, ",", Application.DecimalSeparator)
On Error GoTo 0
UPD:
Цитата
sokol92: Узнать текущий десятичный разделитель можно как в #4,
со слов ТС мне показалось, что это невозможно
Цитата
sokol92: по рабоче-крестьянски
а вот это, конечно, очень мощно  :D  :idea:
Изменено: Jack Famous - 21.11.2019 15:45:41
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
del
Изменено: Jack Famous - 21.11.2019 15:45:24
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
sokol92,
Цитата
Идея менять макросом свойства Application может сильно не понравиться владельцу компьютера
Тоже такие соображения были.

Рабоче-крестьянский метод проверил. Корректно отрабатывает. Спасибо за идею!
 
Это - фундаментальный подход! :)  Работает и для формул Excel и в других ситуациях, например, в Oracle SQL
Код
select substr(3/2 , 2, 1) from dual
Владимир
Страницы: 1
Наверх