PHP中如何在JSON内保留带尾部零的数字类型价格字段
解决方案:PHP生成JSON时保留浮点数尾部零的实现方法
问题根本原因
number_format()返回值为字符串类型,直接写入数组转JSON会得到字符串类型的price字段- PHP原生
json_encode()默认会自动舍去浮点数尾部无意义的零,将4750.0这类值格式化为整数4750输出
方法1:使用内置JSON常量(推荐,PHP >= 5.6.6)
PHP 5.6.6版本新增了JSON_PRESERVE_ZERO_FRACTION常量,作用就是保证浮点数在序列化时保留小数部分,哪怕尾部是零。
代码调整
- 构造数组时,直接将价格处理为1位小数的浮点数,不要用
number_format:
$products[] = array( 'price' => round((float)$row['price'], 1) );
- 调用
json_encode时新增JSON_PRESERVE_ZERO_FRACTION参数:
fwrite($fp, json_encode($products, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRESERVE_ZERO_FRACTION));
输出效果
生成的JSON完全符合预期:
"price": 4750.0
方法2:低版本PHP兼容方案
如果使用的PHP版本低于5.6.6,可以通过字符串替换的方式实现:
- 构造数组时用特殊前缀标记需要保留小数的price值:
$products[] = array( 'price' => '||PRESERVE_FLOAT||' . number_format((float)$row['price'], 1, '.', '') );
- 序列化后做正则替换去掉前缀和引号:
$json = json_encode($products, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $json = preg_replace('/"||PRESERVE_FLOAT||([\d.]+)"/', '$1', $json); fwrite($fp, $json);
内容的提问来源于stack exchange,提问作者egor m
相关产品推荐
相关产品推荐

