Symfony NumberFormatter/Twig:实现金额无小数不显示、有小数保留两位
解决Twig format_currency整数无小数、小数强制两位的需求
你当前的参数组合无法满足需求,原因是:
decimal_always_shown: false会让NumberFormatter自动省略小数部分末尾的零,导致12.10被渲染为12.1- 如果将
decimal_always_shown设为true,整数又会被强制渲染为12.00,不符合你要的无小数格式
Twig的format_currency基于PHP的NumberFormatter,但现有官方参数无法直接实现「整数无小数、小数强制两位」的动态格式,必须通过判断数值来分情况处理,以下是两种可行方案:
方案一:模板内直接判断渲染
在Twig模板中通过条件判断数值是否为整数(或无小数部分),分别调用不同参数的format_currency:
{% set isInteger = (amount == amount|round(0)) %} {% if isInteger %} {{ amount | format_currency('EUR', {fraction_digits: 0, decimal_always_shown: false}, 'fr-FR') }} {% else %} {{ amount | format_currency('EUR', {fraction_digits: 2, decimal_always_shown: true}, 'fr-FR') }} {% endif %}
这里用amount == amount|round(0)来判断是为了兼容浮点数类型的整数值(比如12.0),如果你的amount本身就是整数类型,也可以简化为amount is integer。
方案二:自定义Twig过滤器
如果需要在多个模板中复用该逻辑,建议创建自定义过滤器:
- 编写Twig扩展类:
class CustomCurrencyExtension extends \Twig\Extension\AbstractExtension { public function getFilters(): array { return [ new \Twig\TwigFilter('smart_format_currency', [$this, 'formatCurrency']), ]; } public function formatCurrency(float|int $amount, string $currency = 'EUR', string $locale = 'fr-FR'): string { $isInteger = fmod($amount, 1) === 0; $options = $isInteger ? ['fraction_digits' => 0, 'decimal_always_shown' => false] : ['fraction_digits' => 2, 'decimal_always_shown' => true]; return \Twig\Extension\CoreExtension::formatCurrency($amount, $currency, $options, $locale); } }
- 注册扩展后,在模板中使用:
{{ amount | smart_format_currency('EUR', 'fr-FR') }}
两种方案都能实现你要的效果:整数渲染为12,带小数的数值(包括12.10、12.23)都渲染为两位小数格式。
内容的提问来源于stack exchange,提问作者jean553
相关产品推荐
相关产品推荐

