Как я могу изменить разделитель (локаль) тысяч в Python на разделитель арабского Unicode?
Я хотел бы изменить разделитель тысяч так, чтобы {:,}.format(1234)
в Python используется другой символ. Разделитель должен быть '\u066c'
,
Как я могу установить это, не влияя на другие настройки местных жителей?
РЕДАКТИРОВАТЬ: Любое другое предложение для неопределяемого разделителя, жизнеспособного в фиксированном шрифтом, приветствуется!
2 ответа
Ваши варианты либо взять ,
отформатировать вывод и заменить запятые, переключить локали и использовать 'n'
Числовой формат (который будет форматировать номер на основе текущей локали) или использовать стороннюю библиотеку, например babel. Последний дает вам полный контроль над форматированием чисел, например, при условии, что есть локаль, которая использует U+066C в качестве разделителя тысяч.
С format()
функция, первый вариант довольно прост на самом деле:
>>> format(1234, ',').replace(',', '\u066c')
'1٬234'
Я еще не нашел локаль, которая бы напрямую использовала \u066c
для западно- арабских цифр однако; U+066C обычно используется только с восточно-арабскими цифрами. По крайней мере, в Babel нет таких данных о локали.
Вы можете передать любой вавилон Locale
возразить в babel.numbers.format_number()
функция, поэтому если вам нужен пользовательский разделитель, вы можете клонировать существующую локаль и установить 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'
Далее мы расскажем о превосходном ответе Мартина для использования в 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 }}