Тема: VBS: Региональные настройки с помощью скрипта VBS
Никто не подскажет, как с помощью скрипта VBS распознать, установлена на компе точка или запятая в качестве десятичного разделителя в числах? Спасибо.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Windows Script Host, HTA (VBScript, JScript) → VBS: Региональные настройки с помощью скрипта VBS
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Никто не подскажет, как с помощью скрипта VBS распознать, установлена на компе точка или запятая в качестве десятичного разделителя в числах? Спасибо.
Никто. Потому как региональные настройки разделителей относятся к пользователям, а не к компьютеру.
Проверить для текущего пользователя можно, например, так:
WScript.Echo WScript.CreateObject("WScript.Shell").RegRead("HKCU\Control Panel\International\sDecimal")
Спасибо. Это я и имел в виду. Я рассматривал обьект WshShell, а в нём метод чтения реестра, но какая ветвь в реестре отвечает за десятичный разделитель, я не нашёл. Спасибо, вы ответили.
Всегда использовал определение разделителя через отлов ошибки преобразования из строки, пока не наткнулся на забавную ситуацию с одной региональной настройкой, при которой мой метод ошибался. С реестром связываться не хотелось(хотя способ с реестром когда-то использовал), и тут в голову пришла простая идея как определить десятичный разделитель в системе без обращений к реестру:
DecDilimiter = Mid(CStr(1 / 10), 2, 1)
Может кому-то пригодится как альтернатива .
BeS Yara
1) Можно сразу «CStr(0.1)» вместо «CStr(1 / 10)» — региональные настройки на синтаксис VBScript не влияют.
2) Ответ будет неправильным, например, если в настройках задано не выводить нулевую целую часть числа, т.е. лучше
DecDelimiter = Mid(CStr(1.1), 2, 1)
wisgest
С пунктом 2 согласен, как раз из-за подобной редкой но возможной региональной настройки вынужден был отказаться от старого метода(мог давать ошибку если в качестве десятичного разделителя и разделителя разрядов использовались оба символа). Но это легко поправить - вместо 1/10 приводить к строке 11/10:
DecDilimiter = Mid(CStr(11 / 10), 2, 1)
Насчёт п.1 или я не что-то не понял, или одно из двух. Региональные настройки влияют на формат чисел в vbscript. Моя идея была в том, чтобы непосредственно в локали пользователя получить дробное число, и взять разделитель из него. Если я сразу в строке указываю символ разделителя, то зачем вся конструкция? Тогда можно было бы ограничиться только
DecDelimiter = "."
Правда это не поможет на компе где десятичным разделителем работает запятая...
Региональные настройки влияют на формат чисел в vbscript.
Нет.
Региональные настройки могут влиять на преобразование данных в/из строк(у/и).
На синтаксис языка программирования и, следовательно, на запись в коде литералов чисел они не влияют:
MsgBox 1.1
(что неявно подразумевает
MsgBox CStr(1.1)
) — всегда правильно, а от настроек уже зависит, что увидит пользователь: «1.1» или «1,1».
…можно даже сократить до
DecDelimiter = Mid(1.1, 2, 1)
Тогда можно было бы ограничиться только
DecDelimiter = "."
Правда это не поможет на компе где десятичным разделителем работает запятая...
Аналогия была бы верна, если бы я использовал строку, а не число:
DecDelimiter = Mid("1.1", 2, 1)
Забавно, поменял себе системный разделитель на запятую, vbscript продолжает воспринимать число с десятичной точкой, хотя при выводе и заменяет её на запятую. В VBA тоже самое. Наверное, если бы не использовал точку в качестве разделителя всё время своего общения с компьютером, уже знал бы о таком поведении(для меня не очевидном) - век живи, век учись . Благодарю за разъяснение этого момента.
Правда мне это нужно в VBA для задания ширины колонок листбокса в сантиметрах - размер колонок сохранён в текстовой переменной, но часть размеров дробные. При не совпадающем с системным разделителем в этой строке, попытка присвоения свойства контролу вызывает ошибку. Можно было бы заменить сантиметры на твипы, но есть и другие ситуации когда нужно преобразовывать числовое значение из строки.
И хотя тестовые примеры подтверждают ваши слова, но мне будет спокойнее получать дробь непосредственно в коде . А может всё таки использую предложенный вами вариант записи(Mid(1.1, 2, 1) - лаконично, чёрт побери, и никакие объекты не используются!), и понаблюдаю как он будет себя вести на разных локалях у пользователей.
P.S. почему не пользуюсь чтением из реестра в этом случае - даже не знаю, может быть фобия, может быть желание найти "кроссплатформенный" вариант решения задачи
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться