【问题标题】:How to change locale in python in windows?如何在windows中更改python中的语言环境?
【发布时间】:2018-02-09 17:54:33
【问题描述】:

我想将整数格式的价格转换为格式正确的货币。示例 10000 至或 ₹10,000

所以,我在 python 中使用以下命令

import locale
locale.setlocale(locale.LC_MONETARY, 'en_US')
or
locale.setlocale(locale.LC_MONETARY, 'en_IN')
print str(locale.currency(10000, grouping=True))

当我在不同笔记本电脑的 ubuntu 中的 python 中使用上述命令时,它们运行良好。但是,在 Windows 上它们不起作用。

它给我的错误如下

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\locale.py", line 581, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

如何解决这个错误?

我使用的是 Windows 10。我打开 cmd 并输入“python”回车。 python shell 提供以下版本。我在那里输入上述命令。

Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32

注意:- 我尝试将 locale.py 文件从 ubuntu 系统中的 python 目录复制到 Windows 目录,即“C:\Python27\Lib”,但它仍然无法正常工作。

【问题讨论】:

  • 请关注:locale settings
  • @Dharmesh 您提供的链接给出了 ubuntu 系统的答案,而不是 Windows 系统的答案。您是否尝试过任何解决方案?如果是,那么请给出解决方案。谢谢。
  • @direprobs 我看过那个链接。我可以为 $ 设置 'en_US' 但我需要为 ₹ 设置 'en_IN' 我该怎么做?请尝试一下。

标签: python windows python-2.7 locale setlocale


【解决方案1】:

对于windows,需要设置locale.setlocale(locale.LC_ALL, '&lt;language string&gt;') https://msdn.microsoft.com/en-us/library/39cwe7zf(vs.71).aspx(已弃用) https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.140).aspx(更新)。

【讨论】:

  • 你是对的 $ 即 en_US。但是如何设置印度为 (₹) msdn 链接不包含印度英语字符串。我想用 ₹
  • 我可以在 ubuntu 系统中使用 'en_IN' 但我无法在 Windows 系统中使用它。 Windows 中的“en_IN”是什么?请尝试一下。
【解决方案2】:

您可以查看pycountry 库以了解 Windows 和 Linux 语言代码之间的映射:

>>> pycountry.languages.lookup('fr')
Language(alpha_2=u'fr', alpha_3=u'fra', bibliographic=u'fre', name=u'French', scope=u'I', type=u'L')
>>> pycountry.languages.lookup('french')
Language(alpha_2=u'fr', alpha_3=u'fra', bibliographic=u'fre', name=u'French', scope=u'I', type=u'L')
>>> pycountry.languages.lookup('chinese')
Language(alpha_2=u'zh', alpha_3=u'zho', bibliographic=u'chi', name=u'Chinese', scope=u'M', type=u'L')
>>> pycountry.languages.lookup('chinese-traditional')
Traceback (most recent call last):
  ...
LookupError: Could not find a record for 'chinese-traditional'

那么你可以这样做:

import os
import locale
import pycountry

lang = "en_IN"  # your code
language = pycountry.languages.lookup(lang)
if os.name == "posix":
    locale.setlocale(locale.LC_MONETARY, language.alpha_2)
else:
    locale.setlocale(locale.LC_MONETARY, language.name)

编辑

要格式化货币值,您可以考虑使用Babel,例如:

>>> babel.numbers.format_currency(10000, 'INR', locale='en_IN')
u'\u20b9\xa010,000.00'

>>> print(babel.numbers.format_currency(10000, 'INR', locale='en_IN'))
₹ 10,000.00

【讨论】:

  • 它可以工作,但有一个小问题我想知道原因。我使用了上面的代码并使用了 lang = "hindi" 然后在其他部分的 setlocale 之后,它是成功的,但是当我使用以下行 print str(locale.currency(10000, grouping=True)) 它给了我以下输出? 10,000.00 我想知道为什么会有?而不是₹任何想法?还是我做错了什么?
  • str() 使用 7 位 ASCII(在 Python 2.7 中)从 unicode 转换,您的货币符号超出该范围,因此它被转换为替换字符。
  • @AvtarSingh:您遇到此错误是因为您的控制台不支持 UTF-8 并且配置为使用 ISO-8859-1 (latin1)。所以,这只是你控制台上print的问题,结果是OK的。
  • "en-IN" 在从 Vista 开始的 Windows NLS API 中可用,当然在 Windows 10 中也可用。但是,Python 2.7 使用的 C 运行时不理解新的 WinAPI 语言环境-Vista 引入的名称字符串,例如“en-IN”。它改用 LCID,通过全名或 3 个字母缩写(例如“english_india”或“eng_ind”)查找。即使在 Python 3 中,CRT 版本也可以处理 locale-name 字符串,但 locale 模块本身不能,主要是因为它想要使用下划线,而 Windows 需要连字符。
  • “?”的问题货币符号是因为“en-IN”语言环境使用 1252 作为其旧代码页,该代码页适用于西欧并且不映射“₹”字符。 Python 2.7 (VS 2008) 使用的 C 运行时在 C localeconv 返回的 lconv 结构中没有宽字符替代项。从 VS 2010(由 Python 3.4 使用)开始,MSVC 添加了 wchar_t 替代品,例如 _W_currency_symbol,因此如果您想在跟踪器上创建问题,可以在 Python 3 中解决这个问题。
【解决方案3】:

对于 Python 3.6.4,我在 Windows 10 上执行了以下操作

import locale
locale.setlocale(locale.LC_ALL,'enn')
>>'English_India.1252'
locale.currency(10000000.32,grouping=True,symbol=True)
>>'? 1,00,00,000.32'
locale.currency(10000000.32,grouping=True,symbol=True).replace('?','₹')
>>'₹ 1,00,00,000.32'

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2018-07-09
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2019-08-08
    • 2013-04-27
    相关资源
    最近更新 更多