【问题标题】:php json decode number issuephp json解码数字问题
【发布时间】:2011-11-04 07:51:58
【问题描述】:

我在 php json decode number 遇到了一些麻烦。

$json = '[{"num":123456789011121314},{"num":1516171819202122232425}]';
$number = json_decode($json);
foreach($number as $num){
    echo $num->num.'<br />';
    //echo (int)$num->num.'<br />';
}

这将得到:

1.23456789011E+17
1.5161718192E+21

还 (int) 执行错误的回调。以及如何获得原始号码?谢谢。

我需要

123456789011121314    
1516171819202122232425

【问题讨论】:

标签: php json


【解决方案1】:

如果您使用的是 PHP 5.4 或更高版本,您可以这样做:

$number = json_decode($json, true, 512, JSON_BIGINT_AS_STRING);

这会将这些大数字表示为字符串而不是整数。如果您有权访问生成 json 的代码,您还可以将数字编码为字符串。

【讨论】:

  • 不幸的是,该选项是 PHP 5.4+。
【解决方案2】:

由于json结构并不复杂,我们可以用一个简单的正则表达式来修复它。这个想法是用双引号将数字括起来。

$json = '[{"num":123456789011121314},{"num":1516171819202122232425}]';
$sanitized = preg_replace('/:(\w*\d+)/', ':"$1"', $json);
$number = json_decode($sanitized);

这对你来说应该很好,对我也一样。

该模式匹配一​​个冒号,后跟一些可选的空格,后跟一个数字。

【讨论】:

  • 为 {"test":":3432"} 生成无效的 JSON。
  • @gimpe 确实,但我不认为":3432" 是一个有效数字。是吗?
  • 否,但它是一个有效的字符串。事实上,我想警告人们只在只有数字的特定情况下使用这个正则表达式,并且你不能让用户输入看起来像“:数字”。它几乎对我有用:) 谢谢。
【解决方案3】:

使用 128 位系统?

第二个数字甚至比 64 位机器可以容纳的整数还要大,因此它被转换为浮点数。提示精度损失和指数部分。

另一种解决方案:使用较小的数字。

如果您绝对必须拥有这些数字,请查看 BC-MathGMP 等 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2017-02-14
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多