You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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过滤器

如果需要在多个模板中复用该逻辑,建议创建自定义过滤器:

  1. 编写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);
    }
}
  1. 注册扩展后,在模板中使用:
{{ amount | smart_format_currency('EUR', 'fr-FR') }}

两种方案都能实现你要的效果:整数渲染为12,带小数的数值(包括12.10、12.23)都渲染为两位小数格式。

内容的提问来源于stack exchange,提问作者jean553

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:16:01