Найти - Пользователи
Полная версия: Системный десятичный разделитель
Начало » Python для новичков » Системный десятичный разделитель
1
SirJorah
Уважаемые коллеги! Посредством comtypes вгоняю данные в Excel. Чтобы Excel отображал float вида 12345.60 с двумя знаками после точки, ему надо сказать
Cells[1, 2].NumberFormat = '0.00'
, однако беда в том, что на разных компьютерах могут быть установлены различные десятичные разделители. Excel же ждет, что в строке, передаваемой в NumberFormat, ему укажут именно тот разделитель, который установлен в настройках системы. А Питон хоть через
locale.localeconv()['decimal_point']
, хоть через выкрутас вида
    def GetDcmlSep(self):
        return str(bytes(str(3 / 2))[1])
всегда возвращает точку. Может, кто-нибудь в курсе, как добраться до реальной системной настройки? Пока появилась только мысль сделать через try…except, но это как-то не кошерно что ли.
Shaman
а
locale.setlocale(...)
перед
locale.localeconv()['decimal_point']
было?
SirJorah
Если указать
 locale.setlocale(locale.LC_NUMERIC, 'ru_RU')
, выскакивает Error: unsupported locale setting. К тому же результату приводит ‘ru_ru’ и просто ‘ru’. При этом в официальной документации https://docs.python.org/2/library/locale.html есть следующий пример:
# use German locale; name might vary with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
и в самой библиотеке locale.py все эти ‘ru_RU’ и ‘de_DE’ присутствуют.
Shaman
name might vary with platform
>>> locale.getlocale()
('Russian_Russia', '1251')
>>> locale.setlocale(locale.LC_NUMERIC, 'Russian_Russia')
'Russian_Russia.1251'
>>> locale.setlocale(locale.LC_NUMERIC, '')
'Russian_Russia.1251'
>>> 
SirJorah
Вот спасибо! Проверил, работает и с запятой, и с точкой. Конечно, видел, что “name might vary with platform”, но они же не разъясняют, как именно может отличаться. А в консоли я наблюдаю следующее:
>>> import locale
>>> locale.getlocale()
(None, None)
>>>
Вот и не понимал, как правильно обозвать русскую локаль (((
sander
SirJorah
locale.getdefaultlocale()
SirJorah
Ага! getdefault возвращает действительно не None:
>>> import locale
>>> locale.getdefaultlocale()
>>> ('ru_RU', 'cp1251')
Тем не менее, на вход для setlocale принимает не ‘ru_RU’, а как указал уважаемый Shaman, ‘Russian_Russia’ Такая вот петрушка…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB