1

Тема: VBS: Региональные настройки с помощью скрипта VBS

Никто не подскажет, как с помощью скрипта VBS распознать, установлена на компе точка или запятая в качестве десятичного разделителя в числах? Спасибо.

2

Re: VBS: Региональные настройки с помощью скрипта VBS

Никто. Потому как региональные настройки разделителей относятся к пользователям, а не к компьютеру.

Проверить для текущего пользователя можно, например, так:

WScript.Echo WScript.CreateObject("WScript.Shell").RegRead("HKCU\Control Panel\International\sDecimal")

3

Re: VBS: Региональные настройки с помощью скрипта VBS

Спасибо. Это я и имел в виду. Я рассматривал обьект WshShell, а в нём метод чтения реестра, но какая ветвь в реестре отвечает за десятичный разделитель, я не нашёл. Спасибо, вы ответили.

4

Re: VBS: Региональные настройки с помощью скрипта VBS

Всегда использовал определение разделителя через отлов ошибки преобразования из строки, пока не наткнулся на забавную ситуацию с одной региональной настройкой, при которой мой метод ошибался. С реестром связываться не хотелось(хотя способ с реестром когда-то использовал), и тут в голову пришла простая идея как определить десятичный разделитель в системе без обращений к реестру:


DecDilimiter = Mid(CStr(1 / 10), 2, 1)

Может кому-то пригодится как альтернатива .

5

Re: VBS: Региональные настройки с помощью скрипта VBS

BeS Yara
1) Можно сразу «CStr(0.1)» вместо «CStr(1 / 10)» — региональные настройки на синтаксис VBScript не влияют.
2) Ответ будет неправильным, например, если в настройках задано не выводить нулевую целую часть числа, т.е. лучше

DecDelimiter = Mid(CStr(1.1), 2, 1)

6

Re: VBS: Региональные настройки с помощью скрипта VBS

wisgest
С пунктом 2 согласен, как раз из-за подобной редкой но возможной региональной настройки вынужден был отказаться от старого метода(мог давать ошибку если в качестве десятичного разделителя и разделителя разрядов использовались оба символа). Но это легко поправить - вместо 1/10 приводить к строке 11/10:


DecDilimiter = Mid(CStr(11 / 10), 2, 1)

Насчёт п.1 или я не что-то не понял, или одно из двух. Региональные настройки влияют на формат чисел в vbscript. Моя идея была в том, чтобы непосредственно в локали пользователя получить дробное число, и взять разделитель из него. Если я сразу в строке указываю символ разделителя, то зачем вся конструкция? Тогда можно было бы ограничиться только


DecDelimiter = "."

Правда это не поможет на компе где десятичным разделителем работает запятая...

7 (изменено: wisgest, 2016-10-26 17:59:21)

Re: VBS: Региональные настройки с помощью скрипта VBS

BeS Yara пишет:

Региональные настройки влияют на формат чисел в vbscript.

Нет.
Региональные настройки могут влиять на преобразование данных в/из строк(у/и).
На синтаксис языка программирования и, следовательно, на запись в коде литералов чисел они не влияют:

MsgBox 1.1

(что неявно подразумевает

MsgBox CStr(1.1)

) — всегда правильно, а от настроек уже зависит, что увидит пользователь: «1.1» или «1,1».


…можно даже сократить до

DecDelimiter = Mid(1.1, 2, 1)
BeS Yara пишет:

Тогда можно было бы ограничиться только


DecDelimiter = "."

Правда это не поможет на компе где десятичным разделителем работает запятая...

Аналогия была бы верна, если бы я использовал строку, а не число:

DecDelimiter = Mid("1.1", 2, 1)

8

Re: VBS: Региональные настройки с помощью скрипта VBS

Забавно, поменял себе системный разделитель на запятую, vbscript продолжает воспринимать число с десятичной точкой, хотя при выводе и заменяет её на запятую. В VBA тоже самое. Наверное, если бы не использовал точку в качестве разделителя всё время своего общения с компьютером, уже знал бы о таком поведении(для меня не очевидном) - век живи, век учись . Благодарю за разъяснение этого момента.

Правда мне это нужно в VBA для задания ширины колонок листбокса в сантиметрах - размер колонок сохранён в текстовой переменной, но часть размеров дробные. При не совпадающем с системным разделителем в этой строке, попытка присвоения свойства контролу вызывает ошибку. Можно было бы заменить сантиметры на твипы, но есть и другие ситуации когда нужно преобразовывать числовое значение из строки.

И хотя тестовые примеры подтверждают ваши слова, но мне будет спокойнее получать дробь непосредственно в коде . А может всё таки использую предложенный вами вариант записи(Mid(1.1, 2, 1) - лаконично, чёрт побери, и никакие объекты не используются!), и понаблюдаю как он будет себя вести на разных локалях у пользователей.

P.S. почему не пользуюсь чтением из реестра в этом случае - даже не знаю, может быть фобия, может быть желание найти "кроссплатформенный" вариант решения задачи