#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
or33.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. Это единственный способ, если вы хотите сохранить некоторые числовые значения в виде строки (код НДС, телефон?), А другие — в виде чисел.