如何将Python中的(locale)千位分隔符更改为阿拉伯语Unicode分隔符?

时间:2016-10-20 12:12:21

标签: python python-3.x number-formatting arabic digit-separator

我想更改千位分隔符,以便Python中的{:,}.format(1234)使用不同的字符。分隔符应为'\u066c'

如何设置此项而不影响任何其他本地设置?

编辑:欢迎任何其他建议使用固定字体的无效分隔符!

2 个答案:

答案 0 :(得分:6)

您的选择是采用,格式化输出并替换逗号,切换区域设置并使用'n'数字格式(将根据当前区域设置格式化数字),或使用像babel这样的第三方图书馆。例如,后者为您提供对number formatting的完全语言环境控制,前提是存在使用U + 066C作为千位分隔符的语言环境。

使用format() function,第一个选项非常简单:

>>> format(1234, ',').replace(',', '\u066c')
'1٬234'

我还没有找到直接使用\u066c Western 阿拉伯数字的区域设置; U + 066C通常仅用于东方阿拉伯数字。 Babel至少不包含任何此类语言环境数据。

您可以将任何babel Locale对象传递到babel.numbers.format_number() function,因此如果您需要自定义分隔符,则可以克隆现有区域设置并设置Locale.number_symbols['group']值:

from copy import deepcopy
from babel import Locale

altered_locale = deepcopy(Locale('en', 'US'))
altered_locale.number_symbols['group'] = '\u066c'

导致预期的输出:

>>> from babel.numbers import format_number
>>> format_number(1234, locale=altered_locale)
'1٬234'

答案 1 :(得分:1)

在如何在Django模板中覆盖语言环境的情况下,Martijn为在Django中进一步使用提供了很好的答案。

文件myapp/templatetags/extra.py

from django import template
from django.utils.translation import get_language
from copy import deepcopy
from babel import Locale
from babel.numbers import format_number

register = template.Library()

@register.filter
def currency(value):
    lang = get_language()
    locale = deepcopy(Locale(lang))
    if lang == 'ru':  # for example if russian
        locale.number_symbols['group'] = '.'
    return format_number(value, locale=locale)

在模板中:

{% load extra %}
{{ price|currency }}