当我将带有前导零号的电话号码(即字符串)传递给json_decode
时,它会删除第一个零字符并将其转换为浮点数。
$string = '09178882356'; //dynamic value
echo json_decode($string); //9178882356 will be echo
如何预防?
修改:
Florent提供了一个使用类似的方法的解决方案:
echo json_decode('"'.$string.'"');
它可以工作,但是如果$string
是一个真正的JSON字符串,那么它就会失败。
答案 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