Как увеличить десятичную точность в процентном формате с помощью расширения Twig Intl?

У меня есть десятичное число с 4 цифрами и шкалой 4. (Макс. 0,9999, а мин. 0,0000)

Я использую Twig и его внутреннее расширение. Когда я хочу отобразить процентное число, десятичные дроби округляются.

{% set decimal = 0.0850 %}
{{ decimal|localizednumber('decimal','double','fr-fr') }} //WILL OUTPUT "0,085"
{{ decimal|localizednumber('decimal','double','zh-cn') }} //WILL OUTPUT "0.085"
{{ decimal|localizednumber('decimal','double','ar-bh') }} //WILL OUTPUT "٠٫٠٨٥"
{{ decimal|localizednumber('percent','double','fr-fr') }} //WILL OUTPUT "8 %"
{{ decimal|localizednumber('percent','double','zh-cn') }} //WILL OUTPUT "8%"
{{ decimal|localizednumber('percent','double','ar-bh') }} //WILL OUTPUT "% ٨"

Я хотел бы видеть 8,5 % на французском, 8.5% на китайском и % ٨٫٥ на арабском.

Я попытался добавить параметр double, но это не меняет точности.

Поскольку я использую Symfony, я попытался объявить 2 десятичных знака в числовом формате:

<!-- lang-yml -->
#config/twig.yaml
twig:
    #...
    number_format:
        decimals: 2

Похоже, что расширение Intl переопределяет эти настройки.

Я знаю, что могу сделать что-то вроде

{{ (decimal*100)|localizednumber('decimal','double')}}% 

Но в некоторых языках перед результатом может стоять символ %, во французском языке перед символом % стоит неразрывный пробел.

Ты видишь мою ошибку? У тебя есть решение?


person Alexandre Tranchant    schedule 01.11.2019    source источник


Ответы (1)


Невозможно сделать это напрямую с помощью расширения Twig Intl, которое вы используете.

У него нет параметра для установки точности, он просто создает экземпляр NumberFormatter с выбранным вами стилем форматирования и будет использовать его для format() вашего значения.

Проверьте код здесь.


Есть еще одно расширение с дополнительными параметрами: https://github.com/twigphp/intl-extra

С помощью этого вы можете указать все атрибуты, поддерживаемые NumberFormatter, как показано здесь .

Вы бы использовали это так:

{% set decimal = 0.0850 %}
{{ decimal|format_number(style='percent', locale='fr', {min_fraction_digit: 1}) }}

Кроме того, вы можете написать собственное расширение, используя NumberFormatter.

Шаблон, который NumberFormatter::PERCENT использует по умолчанию, — это #,##0 %, который не включает десятичную точность. Вы можете определить свой собственный шаблон, следуя этим правилам так оно и есть.

Или просто позвоните setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 1), чтобы указать минимальное количество интересующих вас десятичных чисел.

Например:

$formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 1);

Окончательная реализация зависит от вас, и если вам нужно использовать ее в шаблоне Twig, вам придется создайте свой собственный (официальные документы по Symfony) .

Дополнительные примеры см. здесь.

person yivi    schedule 02.11.2019
comment
Большое спасибо за ответ. Я уже проголосовал за него, но я хочу изучить последнюю идею, прежде чем принять ее. Потому что я вижу в исходном коде, что функция localized_number вызывает через атрибут максимальное количество цифр getAttribute(NumberFormat::MAX_FRACTION_DIGITS). Кажется, что можно установить этот глобальный параметр. Я попытаюсь изучить эту последнюю идею, но я думаю, что ваш ответ - лучшее решение. - person Alexandre Tranchant; 05.11.2019
comment
Вы абсолютно правы, вы могли бы использовать setAttribute(). Я обновлю ответ, чтобы учесть это. - person yivi; 05.11.2019
comment
Большое спасибо, это идеально. Я создал свое собственное расширение, используя NumberFormatter, и теперь я использую свое расширение для автоматического выбора подходящего языка, который может исходить из настроек сеанса или пользователя. Это расширение тоже кажется интересным. - person Alexandre Tranchant; 06.11.2019