如何在Twig、Symfony2中获取货币符号?

3

我目前能够在Symfony2控制器中获取货币符号。

$formatter = new \NumberFormatter($this->getRequest()->getLocale(),\NumberFormatter::CURRENCY);
$symbol = $formatter->getSymbol(\NumberFormatter::CURRENCY_SYMBOL);

然后将其传递给twig。

然而,由于我需要在许多twig模板中获取此货币符号,在相应的控制器中插入该代码不是一件愉快的事情。那么,有没有更好/更容易的方法直接在twig中完成呢?

谢谢。


2
一个Twig扩展是否可以? - Prisoner
你是正确的。我错过了Twig扩展手册。谢谢。 - ihsan
1个回答

5
这是我创建自定义Twig函数的方法:
namespace Acme\DemoBundle\Twig;

class AcmeExtension extends \Twig_Extension
{
    public function getFunctions() {
        return array(
            'currencySymbol' => new \Twig_Function_Method($this, 'currencySymbolFunction'),
        );
    }

    public function currencySymbolFunction($locale) {
        $locale = $locale == null ? \Locale::getDefault() : $locale;
        $formatter = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
        $symbol = $formatter->getSymbol(\NumberFormatter::CURRENCY_SYMBOL);

        return $symbol;
    }

    public function getName() {
        return 'acme_extension';
    }
}

这项服务:

acme.twig.acme_extension:
    class: Acme\DemoBundle\Twig\AcmeExtension
    tags:
        - { name: twig.extension }

因为我需要在Twig函数中获取并传递Symfony2 parameters.ini中定义的当前区域设置,所以我定义了一个全局Twig值:
twig:
    globals:
        locale: %locale%

最后在 Twig 模板中:

{{ currencySymbol(locale) }}

4
我喜欢这个,但是实施后,我只得到一个奇怪的小符号 ¤,而不是英镑符号(或任何其他货币符号),当搜索时没有结果。 - Doug
1
@doug 如果你能以某种方式将$currency(应该是类似于“EUR”的字符串)传递给过滤器,那么请将新格式化程序行更改为类似于$formatter = new \NumberFormatter($locale."@currency=$currency", \NumberFormatter::CURRENCY);的内容。 - Cesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接