お金を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コードで通貨記号を取得する方法はありますか?
https://github.com/symfony/Intl を使用してこれを達成しました。
Symfony\Component\Intl\Intl::getCurrencyBundle()->getCurrencySymbol('EUR')
戻り値
'€'.
まず第一に、地球上の誰もが読んで理解できる国際的なグローバル通貨記号表はありません。
各地域/国では通貨記号が異なるため、ブラウザ/ユーザーロケールを使用して、誰が読んでいるかに基づいて通貨記号を決定する必要があります。
正しい方法は、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は次のようになります。
この関数を使用してロケールを設定する場合setlocale("LC_ALL", "es_AR");
localeconv()['currency_symbol']
またはlocaleconv()['int_curr_symbol']
を使用して、ロケール通貨記号と通貨記号の国際的なバリエーションを取得できます。
シンボルはマルチバイトにすることができるため、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);
Zend_Locale::getTranslationList('CurrencySymbol')
3文字の通貨コードの連想配列をシンボルに提供します。
次のように使用できます:
$curArr = Zend_Locale::getTranslationList('CurrencySymbol');
echo $curArr['GBP'];
Crypticには良い答えがありますが、もっと簡単な方法があります。
preg_replace('#[a-z0-9.]*#i', '', $formatter->formatCurrency('0', $currency))
これは、別の関数を宣言する必要のないニースのシンプルなインラインソリューションですが、すべての場合(文字が出力の一部である通貨など)を適切に処理することもできません。しかし、例えば$と£、それは正常に動作します。