在PHP中获取货币符号

k2fxgqgv  于 2022-12-25  发布在  PHP
关注(0)|答案(9)|浏览(181)

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

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

这将打印:¥123,456,789.
这是确定的,如果你想格式化货币。
但我想做的是得到货币符号(例如¥)为给定的货币ISO 4217代码(例如日元)。
我的第一个猜测是尝试使用:

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

但这为构造函数(en_US)中给定的区域设置提供了货币符号,在我的例子中是$。
有没有办法在PHP中通过货币ISO 4217代码获得货币符号?

polhcujo

polhcujo1#

首先,没有国际通用的全球货币符号表,地球上的任何人都可以阅读和理解。
每个地区/国家的货币符号都不同,这就是为什么您必须使用浏览器/用户区域设置,根据阅读者来确定货币符号。
正确的方法正如您所猜测的那样,使用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;

这样,符号将可被用户理解。
例如,$符号将为:

    • 加拿大元 *(CAD):美国加元,罗马尼亚加元,伊朗加元
    • 伊朗里亚尔 (IRR):IRR在美国,而在伊朗将是***
k75qkfdt

k75qkfdt2#

我使用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');
5gfr0r5j

5gfr0r5j3#

由于符号可以是多字节的,我使用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);
xjreopfe

xjreopfe4#

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

de90aj5v

de90aj5v5#

您可以使用Symfony国际组件
使用composer require symfony/intl通过composer安装
然后使用以下代码获取HTML符号

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

sg24os4d6#

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

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

这是一个很好的简单的内联解决方案,不需要声明另一个函数,但是它也不能正确处理所有情况--例如输出中包含字母的货币。但是对于区分$和£,它可以很好地工作。

f87krz0w

f87krz0w7#

Zend_Locale::getTranslationList('CurrencySymbol')

将给予你一个关联数组的3个字母的货币代码,以他们的符号。
然后可以这样使用:

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

avwztpqn8#

我用了这个代码和这个代码在php

/**
   <php ?
      $CS = new NumberFormatter('en_PH', NumberFormatter::CURRENCY);
      $CS = $CS->getSymbol(NumberFormatter::CURRENCY_SYMBOL);
   ?>
   */

我得到了PHP的货币符号
我也试过用HTML代码“&#8369”来写PHP,但是在php服务器中使用php mail时不起作用,特别是如果你使用的是电子邮件服务器。
试试这个代码。

db2dz4w8

db2dz4w89#

试试这个变体:

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

相关问题