PHP имеет десятичные числа с помощью json_encode

#php #json

#php #json

Вопрос:

У меня проблема с некоторым кодом json, где десятичные числа ДОЛЖНЫ быть закодированы без кавычек и содержать два знака после запятой

например

 {12.34, 33.40, 25.00}
  

Моя проблема в том, что массив, который у меня есть, создает числа в виде строки

 foreach($numbers as $n)
{
  $result[] = number_format($n, 2, '.', '');
}
json_encode($result);

// result = {"12.34", "33.40", "25.00"}
  

Комментарии:

1. Я не думаю, что вы можете получить значение типа 33.40 или 25.00 в виде чего-либо, кроме строки… т.е. причина number_format всегда возвращает строку

2. Отметьте M, попробуйте var_dump(33.40); он возвращает тип с плавающей запятой

3. Да, это тип с плавающей запятой, но результирующее значение таковым 33.4 не 33.40 является. Вы получите тот же результат для 33.4000 or 33.4000000 — все удалят ненужные 0 и вернут 33.4

4. @MarkM прав. Это невозможно в PHP. Выполняйте echo 34.40; . Он будет отображаться без последнего нуля. То же самое касается var_dump .

5. Это также не имеет особого смысла в другом месте. Здесь обсуждается проблема: groups.google.com/forum /#!тема/json-схема/NPIy68ZXE_k

Ответ №1:

Вы можете использовать floatval() :

 $result[] = floatval(number_format($n, 2, '.', ''));
  

Комментарии:

1. Я пробовал это, но это противоречит цели использования number_format, поскольку мне всегда нужны две десятичные цифры, например, number_format(1, 2, ‘.’, «) // возвращает значение с плавающей запятой 1,00(number_format(1, 2, ‘.’, «)) // возвращает 1

2. Тогда вы не сможете преобразовать его в число с плавающей запятой, потому .00 что это не имеет значения. Я думаю, вам придется сохранить строку…

3. Преобразование в строку, а затем в бессмысленное значение. Для усечения десятичных чисел используйте round()

Ответ №2:

У меня была похожая проблема с этим. Возможно, это не лучший код, но он работает для меня. Может быть, это может вам помочь. Попробуйте это (я использую codeigniter):

 function getData() {

    $data = $this->Teplomer_model->showData(); //get your data from database as return $query->result();

    //create array
    $arr = array();

    //foreach data to array
    foreach ($data as $row) {
        $arr[] = array(
        "id"                =>  $row->id_teplota,
        "datum"             =>  $row->cas_teplota,
        "teplota"           =>  $row->teplota_teplota,
        "vlhkost"           =>  $row->vlhkost_teplota
        );
    }

    //echo array as json and check if there is any numbers
    echo json_encode($arr, JSON_NUMERIC_CHECK );
}
  

И вывод:

 {"id":3,"datum":"2019-02-08 14:03:31","teplota":22.33,"vlhkost":19.7},{"id":4,"datum":"2019-02-08 14:18:35","teplota":23,"vlhkost":19}
  

Комментарии:

1. Это идеально, если вам не нужны некоторые числовые значения в виде строк. Будьте осторожны. Возможно, вы не хотите, чтобы «00000123» становился 123 или кодом НДС или номером социального страхования или сокращался. В моем городе телефонные номера начинаются с «02», и вы хотите сохранить этот ноль. В этом случае вам нужно создать JSON вручную (как ответ jordan121sa)

Ответ №3:

Вы могли бы сделать:

 $result[] = (float) number_format($n, 2, '.', '');
  

Результат:

 [12.42,33.4,25]
  

Комментарии:

1. То же самое, что я только что ответил Марселю Гвердеру выше. Принудительное присвоение переменной типа float противоречит цели number_format

2. То, что вы хотите, невозможно. Недопустимо, чтобы JSON отбрасывал кавычки без типа int, float или double . Это просто невозможно. Кроме того, вы ничего не сказали о своей проблеме в первоначальном вопросе, поэтому мы фактически решили то, что вы нас спросили.

3. На самом деле я хочу, чтобы тип был плавающим. Также отредактированный первоначальный вопрос, чтобы указать, что число должно иметь два знака после запятой

4. @Martin: То, что делает мой код, — это просто преобразование строки в число с плавающей точкой, так что вы говорите, что мой код правильный. Согласно вашим комментариям, вы не хотите, чтобы тип был плавающим. Вы хотите что-то, чего не существует.

5. Преобразование в строку, а затем в бессмысленное значение. Для усечения десятичных чисел используйте round()

Ответ №4:

Столкнулся с аналогичной проблемой. Единственный способ добиться этого — создать необработанный объект json, а не использовать json_encode.

 $jsonStr = '{';
$lastElement = count($numbers);
$i = 1;
foreach($numbers as $n)
{
  $jsonStr .= number_format($n, 2, '.', '');
  if($i != $lastElement){
     $jsonStr .= ',';
  }
  $i  ;
}
$jsonStr .= '}';
echo $jsonStr;
  

Я знаю, что это не самый лучший способ кодирования, но это единственный способ сохранить десятичные точки в объекте json.

Комментарии:

1. Это единственный способ, если вы хотите сохранить некоторые числовые значения в виде строки (код НДС, телефон?), А другие — в виде чисел.