setlocale на fr-FR в PHP и форматировании чисел

Я пытаюсь создать французскую версию одного из моих сайтов. Я установил setlocale(LC_ALL, 'fr_FR'); вверху своей страницы, и с помощью strftime я правильно отображаю даты во французском стиле.

Однако у меня возникли некоторые проблемы с номером. Часть страницы использует данные, которые я получаю от веб-службы. Я присваиваю возвращаемое значение var следующим образом:

$overallRating = $returnArray['Overall'];

Затем я использую следующий код, чтобы отформатировать его до 1 десятичного знака.

number_format($overallRating,1)

В английской версии значение totalRating может быть 7.5 и возвращает такое значение, как 7.5 (причина запуска его через формат number_format заключается в том, что если он возвращает 7, я хочу, чтобы он отображал 7.0)

Однако во французской версии, если я распечатаю необработанное значение $overallRating, я получу 7,5, что выглядит так, как будто оно переведено на французский язык. Это было бы хорошо, но если я запускаю его через number_format, я получаю сообщение об ошибке:

Notice: A non well formed numeric value encountered in /sites/index.php  on line 250

Строка 250 — это строка number_format.

Я предполагаю, что перевод на 7,5 все испортил, но не уверен, как это решить...

Использование PHP 5.3 на случай, если появится что-то новое, что мне поможет


person bateman_ap    schedule 25.05.2010    source источник
comment
Это звучит так, как будто ваше значение получает number_formatted где-то еще. Вы на 100% уверены, что этого не произойдет? Можете ли вы шаг за шагом проследить, в какой момент происходит преобразование значения?   -  person Pekka    schedule 25.05.2010
comment
Хотя я не форматирую число перед этим, я думаю, что setlocale переводит его, как я сказал в вопросе, если я распечатаю $overallRating на французской странице перед запуском его через number_format, он показывает 7,5 (с запятой) . Я предполагаю, что это приводит к сбою number_format?   -  person bateman_ap    schedule 25.05.2010


Ответы (3)


Так что в конце концов нашел ответ после долгих исследований.

PHP действительно работает только со стандартными десятичными разделителями США и не может справиться с французским разделителем , .

Ответ, хотя и не идеальный, заключается в том, чтобы сбросить числовые значения для использования в США, при этом позволяя форматировать даты и т. Д. На французском языке. Размещение этой строки:

 setlocale(LC_NUMERIC, 'C');

Под

 setlocale(LC_ALL, 'fr_FR'); 

сделал свое дело

person bateman_ap    schedule 26.05.2010

это то, что вы спрашиваете?

<?php
    $overallRating = number_format($number, 1, '.', '');
?>

Позднее редактирование:

<?php
setlocale(LC_ALL, 'fr_FR');
$number = '7';
echo $overallRating = number_format($number, 1, '.', '');
?>
person Mihai Iorga    schedule 25.05.2010
comment
Попробуйте поставить десятичную дробь в числе, это, кажется, проблема. т.е. 7,5 вместо 7 - person bateman_ap; 26.05.2010

Я хотел взять отредактированную на французском языке строку, такую ​​как «54,33», и сохранить ее обратно в базу данных как номер en_US, потому что, как было указано, PHP действительно любит числа только в формате en_US. Я не видел никаких встроенных функций преобразования PHP, поэтому построил это, чтобы выполнить эту работу. Удаляет разделитель тысяч и заменяет десятичный разделитель на "." и он предназначен для работы с любой настройкой.

//Currency Conversion Back to US for DB Storage or PHP number formatting
function number_convert_us($num) {
    $locale_settings = localeconv();
    $num = str_replace($locale_settings['mon_thousands_sep'], "", trim($num));
    $num = str_replace($locale_settings['mon_decimal_point'], ".", $num);
    return number_format((double)$num, 2, '.', '');
}

Я создам аналогичную вещь для JavaScript. Нашел эту библиотеку для отображения: http://software.dzhuvinov.com/jsworld-currency-formatting.html

person David    schedule 21.06.2012