Как я могу изменить разделитель (локаль) тысяч в 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 }}
Другие вопросы по тегам