locale.setlocale(LC_NUMERIC): 如何在Windows系统上使用?

3

我正在使用Win10系统。这是我的小脚本:

import locale
locale.setlocale(locale.LC_NUMERIC,"rus")

print locale.localeconv()

fv = 2.5
print str(fv)

这会打印出:
{'mon_decimal_point': '', 'int_frac_digits': 127, 'p_sep_by_space': 127, 'frac_digits': 127, 'thousands_sep': '\xa0', 'n_sign_posn': 127, 'decimal_point': ',', 'int_curr_symbol': '', 'n_cs_precedes': 127, 'p_sign_posn': 127, 'mon_thousands_sep': '', 'negative_sign': '', 'currency_symbol': '', 'n_sep_by_space': 127, 'mon_grouping': [], 'p_cs_precedes': 127, 'positive_sign': '', 'grouping': [3, 0]}
2.5

我们可以看到十进制小数点是“,”,那么为什么2,5会被打印成2.5呢?谢谢。
1个回答

1

你需要调用locale.str方法,而不是普通的str构造函数。

import locale
locale.setlocale(locale.LC_NUMERIC,"ru_RU.utf8")

print locale.localeconv()

fv = 2.5
print locale.str(fv)

输出

{'mon_decimal_point': '', 'int_frac_digits': 127, 'p_sep_by_space': 127, 'frac_digits': 127, 'thousands_sep': '\xc2\xa0', 'n_sign_posn': 127, 'decimal_point': ',', 'int_curr_symbol': '', 'n_cs_precedes': 127, 'p_sign_posn': 127, 'mon_thousands_sep': '', 'negative_sign': '', 'currency_symbol': '', 'n_sep_by_space': 127, 'mon_grouping': [], 'p_cs_precedes': 127, 'positive_sign': '', 'grouping': [3, 3, 0]}
2,5

下面是一些代码,演示了一个简单的区域设置感知的打印函数。正如我在评论中提到的,通常最好在打印时提供明确的格式规范。当然,在非常简单的脚本和开发/调试期间,基本的print a, b, c形式很方便,但这种输出在除了最简单的情况之外使用时往往显得杂乱无序。
简单的format_string % tuple_of_values风格的格式化不具备区域设置感知能力。locale模块提供了一些函数(format & format_string),它们使用旧的%格式化协议。然而,在现代Python中,%风格的格式化正在被逐步淘汰,取而代之的是内置的format函数和str.format所支持的新风格的格式化。这些format函数为数字提供了本地感知的格式类型说明符:n;下面的代码说明了它的使用。
# -*- coding: utf-8 -*-

import locale
locale.setlocale(locale.LC_NUMERIC, "ru_RU.utf8")

def lprint(*args):
    lstr = locale.str
    print ' '.join([lstr(u) if isinstance(u, float) else str(u) for u in args])

lprint(1.25, 987654, 42.0, 2.33, u"Росси́я".encode('UTF-8'), 3.456)
print locale.format_string('%.2f %d %.3f %.3f %s %f', (1.25, 987654, 42.0, 2.33, u"Росси́я", 3.456))
print '{0:n} {1:n} {2:n} {3:n} {4:n} {5}'.format(1.25, 987654, 42.0, 2.33, 3.456, u"Росси́я".encode('UTF-8'))

输出(在设置为使用UTF-8编码的终端中)

1,25 987654 42 2,33 Россия 3,456
1,25 987654 42,000 2,330 Россия 3,456000
1,25 987 654 42 2,33 3,456 Россия

请注意,在第二行中,我们可以传递Unicode字符串对象,因为locale.format_string知道编码方式。在输出的最后一行中,数字987654会以千位分隔符打印出来,在俄罗斯语环境中,千位分隔符是一个空格。
如果您使用Python 2.7(或更高版本),那么'{0:n} {1:n} {2:n} {3:n} {4:n} {5}'格式字符串可以简化为'{:n} {:n} {:n} {:n} {:n} {}'。当然,在Python 3中,print语句已不再可用:它被print函数所取代;您可以在Python 2的后续版本中通过在任何其他import语句之前执行from __future__ import print_function来访问该函数。

太好了!这在文档中已经写明了!!我太菜了...只是以防万一:如果我想要脚本中的所有“print”使用给定的区域设置/编码打印值,有没有办法做到这一点?比如说“使用CP1251”之类的? - 62mkv
@62mkv:并不是这样,而且这也违背了Python口号的精神:“明确优于隐晦”。你可以编写一个简单的函数来代替print语句。然而,在打印时提供明确的格式通常比依赖默认格式更好。我会在我的答案中添加一些示例。 - PM 2Ring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接