Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 5, 2015 08:41:30

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

Системный десятичный разделитель

Уважаемые коллеги! Посредством 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, но это как-то не кошерно что ли.

Отредактировано SirJorah (Июнь 5, 2015 08:44:12)

Офлайн

#2 Июнь 5, 2015 11:07:27

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Системный десятичный разделитель

а

locale.setlocale(...)
перед
locale.localeconv()['decimal_point']
было?

Офлайн

#3 Июнь 5, 2015 12:34:50

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

Системный десятичный разделитель

Если указать

 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’ присутствуют.

Офлайн

#4 Июнь 5, 2015 13:42:33

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Системный десятичный разделитель

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'
>>> 

Отредактировано Shaman (Июнь 5, 2015 13:44:28)

Офлайн

#5 Июнь 5, 2015 14:02:51

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

Системный десятичный разделитель

Вот спасибо! Проверил, работает и с запятой, и с точкой. Конечно, видел, что “name might vary with platform”, но они же не разъясняют, как именно может отличаться. А в консоли я наблюдаю следующее:

>>> import locale
>>> locale.getlocale()
(None, None)
>>>
Вот и не понимал, как правильно обозвать русскую локаль (((

Офлайн

#6 Июнь 5, 2015 14:12:13

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Системный десятичный разделитель

SirJorah

locale.getdefaultlocale()

Офлайн

#7 Июнь 5, 2015 14:30:26

SirJorah
Зарегистрирован: 2015-04-21
Сообщения: 41
Репутация: +  2  -
Профиль   Отправить e-mail  

Системный десятичный разделитель

Ага! getdefault возвращает действительно не None:

>>> import locale
>>> locale.getdefaultlocale()
>>> ('ru_RU', 'cp1251')
Тем не менее, на вход для setlocale принимает не ‘ru_RU’, а как указал уважаемый Shaman, ‘Russian_Russia’ Такая вот петрушка…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version