json_decode在字符串数字中的第一个char处删除零

时间:2013-10-01 16:04:54

标签: php json

当我将带有前导零号的电话号码(即字符串)传递给json_decode时,它会删除第一个零字符并将其转换为浮点数。

$string = '09178882356'; //dynamic value
echo json_decode($string); //9178882356 will be echo

如何预防?

修改
Florent提供了一个使用类似的方法的解决方案:

echo json_decode('"'.$string.'"');

它可以工作,但是如果$string是一个真正的JSON字符串,那么它就会失败。

2 个答案:

答案 0 :(得分:3)

您正在解码数字。 您应该将代码更改为:

echo json_decode('"09178882356"');

修改

  

它可以工作,但如果$string是一个真正的JSON字符串,那么它就会失败。

问题是你并不真正了解你的对象类型。也许你应该停止向这个函数发送真正的JSON字符串,或者在你的函数之外用引号包装你的数字。

您可以尝试这样的事情:

if (is_number($str)) {
    $str = '"'.$str.'"';
}

echo json_decode($str);

答案 1 :(得分:0)

以下函数将考虑多个前导零,如果遇到前导零,则转换为字符串:

    function check_number($num){
        $re = '/[0]+/m';

        preg_match_all($re, $num, $matches, PREG_SET_ORDER, 0); 

        $leading_zero = $matches[0][0] ?? false;
        $length = 0;

        if( $leading_zero !== false){
            $length = strlen($num);

            $test = "%'.0{$length}d\n";

            return sprintf("%'.0{$length}d\n",$num);                
        }

        return $num;
    }
$one = '07';
$one = check_number($one) // returns '07' string with json_encode and JSON_NUMERIC_CHECK flag

$two = '007';
$two = check_number($two) // returns '007' string with json_encode and JSON_NUMERIC_CHECK flag

$num = 7;
$num = check_number($num) // returns 7 int with json_encode and JSON_NUMERIC_CHECK flag