如何将 Python 中的(语言环境)千位分隔符更改为阿拉伯语 Unicode 分隔符?
How can I change the (locale) thousands separator in Python to Arabic Unicode separator?
我想更改千位分隔符,以便 Python 中的 {:,}.format(1234)
使用不同的字符。分隔符应为 '\u066c'
.
如何在不影响任何其他本地设置的情况下进行设置?
编辑:欢迎任何其他关于在固定字体中可行的普通分隔符的建议!
您的选择是采用 ,
格式的输出并替换逗号,切换语言环境并使用 'n'
数字格式(这将根据当前语言环境格式化数字),或者例如,使用像 babel. The latter gives you full locale control over 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
us_locale = Locale('en', 'US')
base_locale.number_symbols # ensure instance has been populated
altered_locale = deepcopy(us_locale)
altered_locale.number_symbols['group'] = '\u066c'
请注意,在复制之前,您必须访问属性(或 ._data
属性)以触发加载语言环境配置。否则,原始(源)区域设置和更改后的区域设置之间的数据将被共享(因此我上面代码片段中的 us_locale
对象将具有相同的数字分隔符。
现在使用 altered_locale
对象会产生预期的输出:
>>> from babel.numbers import format_number
>>> format_number(1234, locale=altered_locale)
'1٬234'
将 Martijn 的出色回答进一步用于 Django,关于如何覆盖 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 }}
我想更改千位分隔符,以便 Python 中的 {:,}.format(1234)
使用不同的字符。分隔符应为 '\u066c'
.
如何在不影响任何其他本地设置的情况下进行设置?
编辑:欢迎任何其他关于在固定字体中可行的普通分隔符的建议!
您的选择是采用 ,
格式的输出并替换逗号,切换语言环境并使用 'n'
数字格式(这将根据当前语言环境格式化数字),或者例如,使用像 babel. The latter gives you full locale control over 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
us_locale = Locale('en', 'US')
base_locale.number_symbols # ensure instance has been populated
altered_locale = deepcopy(us_locale)
altered_locale.number_symbols['group'] = '\u066c'
请注意,在复制之前,您必须访问属性(或 ._data
属性)以触发加载语言环境配置。否则,原始(源)区域设置和更改后的区域设置之间的数据将被共享(因此我上面代码片段中的 us_locale
对象将具有相同的数字分隔符。
现在使用 altered_locale
对象会产生预期的输出:
>>> from babel.numbers import format_number
>>> format_number(1234, locale=altered_locale)
'1٬234'
将 Martijn 的出色回答进一步用于 Django,关于如何覆盖 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 }}