在PHP中获取货币符号

ump*_*sky 40 php formatting currency

让我们从简单的代码开始,用以下内容来格式化NumberFormatter:

$formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(123456789, 'JPY');
Run Code Online (Sandbox Code Playgroud)

这打印:¥123,456,789.

如果你想格式化钱,这是可以的.

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

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

$formatter->getSymbol(NumberFormatter::CURRENCY_SYMBOL);
Run Code Online (Sandbox Code Playgroud)

但是,这给出了构造函数(en_US)中给出的区域设置的货币符号,在我的情况下为$.

有没有办法用PHP中的货币ISO 4217代码获取货币符号?

小智 42

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

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

正如您猜测的那样,正确的方法是使用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;
Run Code Online (Sandbox Code Playgroud)

这样,用户可以理解符号.

例如,$ symbol将是:

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


ump*_*sky 15

我用https://github.com/symfony/Intl实现了这个目的:

Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
Run Code Online (Sandbox Code Playgroud)

回报

'€'.
Run Code Online (Sandbox Code Playgroud)

  • @geoidesic我问了这个问题,目标是在PHP中获取货币符号.允许并鼓励使用第三方库. (7认同)
  • 技术上(恕我直言)这实际上没有回答这个问题,这个问题是关于PHP,而不是Symfony. (4认同)
  • 此外,多么美妙的语法。 (2认同)

cry*_*c ツ 5

由于符号可以是多字节的,我使用 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);
Run Code Online (Sandbox Code Playgroud)


Fed*_*tta 5

如果使用此函数设置区域设置,setlocale("LC_ALL", "es_AR"); 则可以使用localeconv()['currency_symbol']localeconv()['int_curr_symbol']来获取区域设置货币符号和货币符号的国际变体。