On 6/22/11 Jun 22 -11:59 AM, Daniel Brunner wrote:
(json:encode-json-to-string 0.0570714084012434D0)
I have replicated this error....
The bug is here:
(defun write-json-number (nr stream) "Write the JSON representation of the number NR to STREAM." (typecase nr (integer (format stream "~d" nr)) (real (format stream "~f" nr)) (t (unencodable-value-error nr 'write-json-number))))
As can be seen by
CL-USER> (format t "~f" 0.0570714084012434D0) 0.0570714084012434D0 NIL
This suggests that we must avoid using FORMAT in translating floats to strings for JSON, or that there's a recipe for getting FORMAT to shun the D that I don't know about....
Not incredibly well thought out or tested patch:
(defun write-json-number (nr stream) "Write the JSON representation of the number NR to STREAM." (typecase nr (integer (format stream "~d" nr)) (real (let* ((raw (format nil "~f" nr)) (dpos (position #\d raw :test 'char-equal))) (princ (subseq raw 0 dpos) stream))) (t (unencodable-value-error nr 'write-json-number))))
This checks for D in the output. I /believe/ that this is the only such character that can creep in, but I am far from being an expert on this.
Best, r