【问题标题】:Get currency symbol in PHP在 PHP 中获取货币符号
【发布时间】:2012-12-03 13:35:39
【问题描述】:

让我们从一段简单的代码开始,用NumberFormatter格式化货币:

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(123456789, 'JPY');

打印:¥123,456,789

如果你想格式化钱,这没关系。

但我想做的是获取给定货币 ISO 4217 代码(例如 JPY)的货币符号(例如 ¥)。

我的第一个猜测是尝试使用:

$formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL);

但这给出了构造函数 (en_US) 中给出的语言环境的货币符号,在我的例子中是 $。

有没有办法在 PHP 中通过货币 ISO 4217 代码获取货币符号?

【问题讨论】:

  • 问题是货币符号可以出现在数字之前或之后。你用这个符号做什么?
  • 只要对任何不是数字或逗号的东西做一个正则表达式。类似/[^0-9,]*/
  • 一些符号是多字节的,所以简单的字符串搜索不会很好。
  • 我想避免使用正则表达式。实际上,我想修复 github.com/symfony/symfony/blob/master/src/Symfony/Component/… 并摆脱这个正则表达式,我认为 PHP 支持这个。还是谢谢。
  • 我找到的最有用的相关资源是this(是的,它是python,但所有这些函数都在PHP中可用),这是一个有点讨厌的“解决方案”。问题的根源在于此功能取决于主机操作系统是否具有可用的适当语言环境信息 - 但同时我看不出在这些限制范围内不可能做到这一点的原因。

标签: php formatting currency


【解决方案1】:

我使用https://github.com/symfony/Intl 实现了这一点:

Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')

返回

'€'.

Symfony 4.3 >

值得指出的是 SF4.3 及更高版本已弃用:

/**
 * Returns the bundle containing currency information.
 *
 * @return CurrencyBundleInterface The currency resource bundle
 *
 * @deprecated since Symfony 4.3, to be removed in 5.0. Use {@see Currencies} instead.
 */
public static function getCurrencyBundle(): CurrencyBundleInterface
{

所以,你可以这样做:

use Symfony\Component\Intl\Currencies;
echo Currencies::getSymbol('AUD'); 

【讨论】:

  • 技术上(恕我直言)这实际上并没有回答问题,这是关于 PHP,而不是 Symfony。
  • @geoidesic 我问了这个问题,目标是在 PHP 中获取货币符号。允许并鼓励使用第三方库。
  • 还有,多么优美的语法。
  • 查看 Federico Nicolas Motta 的回答。
【解决方案2】:

您可以使用 Symfony Intl 组件

使用composer require symfony/intl通过作曲家安装它

然后用下面的方式获取 HTML 符号

use Symfony\Component\Intl\Currencies;
\Locale::setDefault('en');
$symbol = Currencies::getSymbol('INR'); // => '₹'
echo $symbol;

【讨论】:

    【解决方案3】:

    如果您使用此功能设置语言环境setlocale("LC_ALL", "es_AR"); 您可以使用localeconv()['currency_symbol']localeconv()['int_curr_symbol'] 获取语言环境货币符号和货币符号的国际变体。

    【讨论】:

      【解决方案4】:
      Zend_Locale::getTranslationList('CurrencySymbol')
      

      将为您提供一个由 3 个字母货币代码组成的关联数组与其符号。

      然后可以这样使用:

      $curArr = Zend_Locale::getTranslationList('CurrencySymbol');
      echo $curArr['GBP'];
      

      【讨论】:

        【解决方案5】:

        首先,世界上没有任何人都可以阅读和理解的国际全球货币符号表。

        在每个地区/国家/地区,货币符号会有所不同,这就是为什么您必须使用浏览器/用户区域设置根据阅读者来确定它们。

        如您所料,正确的方法是使用 NumberFormatter::CURRENCY_SYMBOL,但您首先必须设置适当的语言环境,例如 en-US@currency=JPY

        $locale='en-US'; //browser or user locale
        $currency='JPY';
        $fmt = new NumberFormatter( $locale."@currency=$currency", NumberFormatter::CURRENCY );
        $symbol = $fmt->getSymbol(NumberFormatter::CURRENCY_SYMBOL);
        header("Content-Type: text/html; charset=UTF-8;");
        echo $symbol;
        

        这样用户就可以理解符号了。

        例如,$symbol 将是:

        • 加元 (CAD):CA$在美国,CAD在罗马尼亚,$CA在伊朗
        • 伊朗里亚尔 (IRR):美国为IRR,而伊朗为

        【讨论】:

        • 太棒了!! +1。我只是希望有一种方法可以根据货币iso 检索locale。像rlocaleconv(int_curr_symbol, 'JPY') 这样的东西!
        【解决方案6】:

        Cryptic 有一个很好的答案,但有一种更简单的方法:

        preg_replace('#[a-z0-9.]*#i', '', $formatter->formatCurrency('0', $currency))
        

        这是一个不错的简单内联解决方案,不需要声明另一个函数,但是它也不能正确处理所有情况 - 即字母是输出的一部分的货币。但是为了区分例如$ 和 £,效果很好。

        【讨论】:

          【解决方案7】:

          试试这个变种:

          $formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL);
          

          【讨论】:

            【解决方案8】:

            由于符号可以是多字节的,我使用 mb_*() 函数正确抓取所有非标点符号和非数字字符,它们只会留下符号。

            function get_currency_symbol($string)
            {
                $symbol = '';
                $length = mb_strlen($string, 'utf-8');
                for ($i = 0; $i < $length; $i++)
                {
                    $char = mb_substr($string, $i, 1, 'utf-8');
                    if (!ctype_digit($char) && !ctype_punct($char))
                        $symbol .= $char;
                }
                return $symbol;
            }
            
            $format = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
            $string = $format->formatCurrency(123456789, 'JPY');
            echo get_currency_symbol($string);
            

            【讨论】:

            猜你喜欢
            • 2014-12-07
            • 1970-01-01
            • 1970-01-01
            • 2012-06-12
            • 1970-01-01
            • 2016-03-24
            • 2012-02-01
            • 2018-02-15
            相关资源
            最近更新 更多