У меня большая головная боль по этому поводу. Почему этот код не работает?
<?php
setlocale(LC_MONETARY, 'nl');
$fmt = new NumberFormatter( 'nl', NumberFormatter::CURRENCY );
$num = "€2,50";
echo "We have ".$fmt->parseCurrency($num, $curr)." in $curr\n";
?>
Я пробовал это как на машине Windows, так и на http://phpfiddle.org/. Ожидаемый результат We have 2.50 in EUR
,
Голландский язык выглядит следующим образом:
>>> localeconv()
=> [
"decimal_point" => ",",
"thousands_sep" => ".",
"int_curr_symbol" => "EUR",
"currency_symbol" => b"€",
"mon_decimal_point" => ",",
"mon_thousands_sep" => ".",
"positive_sign" => "",
"negative_sign" => "-",
"int_frac_digits" => 2,
"frac_digits" => 2,
"p_cs_precedes" => 1,
"p_sep_by_space" => 1,
"n_cs_precedes" => 1,
"n_sep_by_space" => 1,
"p_sign_posn" => 4,
"n_sign_posn" => 4,
"grouping" => [
3,
],
"mon_grouping" => [
3,
],
]
Парсер валют очень странный и ожидает неразрывного пробела UTF-8 между символом валюты и номером.
Этот пример отлично работает для меня:
<?php
setlocale(LC_MONETARY, 'nl');
$fmt = new NumberFormatter( 'nl', NumberFormatter::CURRENCY );
$num = "€\xc2\xa02,50";
echo "We have ".$fmt->parseCurrency($num, $curr)." in $curr\n";
?>
\xc2\xa0
код для этого пробела.
Других решений пока нет …