jeston
@jeston

Функция json_decode переформатирует числа?

Столкнулся у себя в коде со странным поведением:
1. приходит некий json, из которого я рассчитываю получить массив.
if ($data['prices']) {
        $prices = json_decode($data['prices'],true);

2. По ходу дебага выяснилось, что $data['prices'] хранит значение
string(28) "{"currency":"UAH","1":152.7}" string(28) "{"currency":"UAH","1":152.7}"

что ожидаемо и меня в принципе устраивает.
3. Но после json_decode я обнаруживаю, что получившийся массив отличается от того, который я жду форматом чисел:
array(2) { ["currency"]=> string(3) "UAH" [1]=> float(152,7) } array(2) { ["currency"]=> string(3) "UAH" [1]=> float(152,7) }

Из-за запятой в числе полученное значение на клиенте кидает математическую формулу в Nan, что меня не устраивает. Дополнительная трудность состоит в том, что править код по существу (ну кроме var_dump и print_r) нельзя.

Заранее благодарю за помощь.
  • Вопрос задан
  • 524 просмотра
Пригласить эксперта
Ответы на вопрос 4
Stalker_RED
@Stalker_RED
Вероятно локаль учитывается.
Можете использовать флаг JSON_BIGINT_AS_STRING и потом floatval(), при необходимости.
Ответ написан
@frees2
setlocale(LC_ALL, 'ru_RU.utf8');
Header("Content-Type: text/html;charset=UTF-8");
Ответ написан
Комментировать
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
сначала преобразуй число в строку
потом регуляркой замени запятые на точки
а потом уже кодь в json

Любишь делать проверки?
Проверь равняется ли исходное число через === тому что получилось. Если нет, запятые заменились. Если да - запятой или не было, или не заменилась.
Ответ написан
Комментировать
Нужно обработать значения с помощью number_format() примерно как то так:

foreach ($prices as $key => $price) {
  $prices[$key]['UAH'] = number_format((float)$prices[$key]['UAH'], 2, '.', '');
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽