Формат числа Twig преобразует double в int

Я пытаюсь напечатать разницу между двумя числами.

При прямой печати оба числа имеют назначенное им значение и имеют запятую в качестве десятичного разделителя:

{{ vals[1] }} --> 7,00
{{ vals[2] }} --> 6,63

чтобы на самом деле иметь возможность вычислять эти числа, я заменяю разделитель , на ., используя |number_format (2, '.', ','). Однако, когда я теперь печатаю эти числа напрямую, я получаю значение int

{{ vals[1]|number_format (2, '.', ',') }} --> 7.00
{{ vals[2]|number_format (2, '.', ',') }} --> 6.00

поэтому, пытаясь вычислить разницу этих значений, я получаю взамен только значения int.

{% set diff = vals[1]|number_format(2, '.', ',') - vals[2]|number_format(2, '.', ',') %} --> 1.00

почему бы не рассчитать разницу раньше, а после этого распечатать результат с помощью number_format ?

hous 15.12.2020 10:31

Я пытаюсь рассчитать разницу, прежде чем распечатать результат. Сами значения поступают из запроса данных sql, и я распечатал их, чтобы увидеть, что вызывает проблему и где происходит переключение double на int.

lechnerio 15.12.2020 10:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
554
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

По какой-то причине мне не удалось установить правильный разделитель запятой с помощью number_format. Вместо этого я использовал replace:

 {% set diff = (vals[1]|replace({',': '.'}) - vals[2]|replace({',': '.'})) %}

Использование twigs number_format является прямым сопоставлением с number_format (с приведением типов):

return number_format((float) $number, $decimal, $decimalPoint, $thousandSep);
                     ^^^^^^^

Ссылка: https://github.com/twigphp/Twig/blob/3.x/src/Extension/CoreExtension.php#L569


То, что вы предоставляете, представляет собой строку "6,63", поэтому в конечном итоге то, что передается нативному number_format, это: 6.00 из-за результата приведения типа.

Ссылка: https://3v4l.org/Md12f


Поэтому, если вы хотите использовать number_format в своих представлениях, не забудьте передать правильные ints или floats. В противном случае используйте значение, являющееся строкой, и используйте методы манипулирования строками (как в вашем ответе).

Этот пример должен работать:

{% set val1 = '7,00'  %}
{% set val2 = '6,63'  %}

{% set val1 = val1|replace({',': '.'})  %}
{% set val2 = val2|replace({',': '.'})  %}

 result = {{ (val1 - val2)|round (2) }}

// output: 0.37

спасибо, это то, что я использую сейчас, см. в других ответах.

lechnerio 15.12.2020 11:29

Другие вопросы по теме