php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #60111 JSON_NUMERIC_CHECK option mangles certain values
Submitted: 2011-10-21 22:56 UTC Modified: 2011-10-22 20:47 UTC
Votes:1
Avg. Score:3.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:0 (0.0%)
From: digit6 at gmail dot com Assigned:
Status: Closed Package: JSON related
PHP Version: 5.3.8 OS: FreeBSD
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: digit6 at gmail dot com
New email:
PHP Version: OS:

 

 [2011-10-21 22:56 UTC] digit6 at gmail dot com
Description:
------------
json_encode will produce undesired results when used with JSON_NUMERIC_CHECK when one or more values is longer than 12 digits, ex: 3434343434343434. The resulting JSON encoded string has the above value listed as: 3434343434340000.

Removing the JSON_NUMERIC_CHECK option fixes the problem, but then all other numeric values are returned as strings rather than integers.



Test script:
---------------
$test = array("test"=>3434343434343434);

$test = json_encode($test, JSON_NUMERIC_CHECK);

echo $test;




Expected result:
----------------
{"test":3434343434343434}
OR
{"test":"3434343434343434"}

Actual result:
--------------
{"test":3434343434340000}

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2011-10-22 00:17 UTC] digit6 at gmail dot com
Incorrect ACTUAL output entered in bug, here is the real actual output:

{"test":3.43434343434e+15}
 [2011-10-22 00:44 UTC] digit6 at gmail dot com
I would further like to add that even if I FORCE the numeric string to be of a string type in the array before passing it to json_encode(), the encode still treats the string encapsulated number as a LONG and not as a string.

There is definitely a bug here.
 [2011-10-22 10:45 UTC] laruence@php.net
-Status: Open +Status: Feedback
 [2011-10-22 10:45 UTC] laruence@php.net
I think your are running in 32-bit os,
 
and I think it is not a bug, since the number value exceed the PHP_INT_MAX.
 [2011-10-22 20:47 UTC] digit6 at gmail dot com
-Status: Feedback +Status: Closed
 [2011-10-22 20:47 UTC] digit6 at gmail dot com
^^ You are actually right on this. I was not taking into account that JSON_NUMERIC_CHECK's actual purpose is to look for strings of numeric values and automatically convert them to int values. In my example of forcing a string type on the numeric string, would still require NUMERIC_CHECK to reformat the var type.

I was simply using JSON_NUMERIC_CHECK to ensure all my number values were integers, the fact that my platform may use a long set of numbers with no alpha chars in a "tracking number" field would break my implementation was not considered.

I'm closing the bug, I'll have to just make sure I'm forcing int values where I require it manually.

Thanks!
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Tue Dec 01 09:01:24 2020 UTC