@@ -25,7 +25,7 @@ module JSON {
2525
2626 public func show(json : JSON ) : Text = switch (json) {
2727 case (#Number (v)) { Int . toText(v); };
28- case (#Float (v)) { Float . format(#fix 2 , v); };
28+ case (#Float (v)) { Float . format(#exact , v); };
2929 case (#String (v)) { " \" " # v # " \" " ; };
3030 case (#Array (v)) {
3131 var s = "[" ;
@@ -179,16 +179,6 @@ module JSON {
179179 }
180180 );
181181
182- private func parseFloat() : P . Parser < Char , (Int , List . List < Char > )> {
183- C . seq< Char , Int , List . List < Char >> (
184- C . Int . int(),
185- C . right(
186- C . Character . char(' .' ),
187- C . many1(C . Character . digit()),
188- ),
189- );
190- };
191-
192182 private func listToNat(list : List . List < Char > ) : Nat {
193183 var n = 0 ;
194184
@@ -200,22 +190,58 @@ module JSON {
200190 };
201191
202192 private func floatParser() : P . Parser < Char , JSON > = C . map(
203- parseFloat(),
204- func ((n, decimal_list) : (Int , List . List < Char > )) : JSON {
205- let n_of_decimals = Float . fromInt(List . size(decimal_list));
193+ C . oneOf([
194+ parseFloatWithExp(),
195+ parseFloat(),
196+ ]),
197+ func (n : Float ) : JSON = #Float (n),
198+ );
206199
207- let num = Float . fromInt(n);
208- let decimals = Float . fromInt(listToNat(decimal_list)) / (10 ** n_of_decimals);
200+ private func parseFloat() : P . Parser < Char , Float > {
201+ C . map(
202+ C . seq< Char , Int , List . List < Char >> (
203+ C . Int . int(),
204+ C . right(
205+ C . Character . char(' .' ),
206+ C . many1(C . Character . digit()),
207+ ),
208+ ),
209+ func ((n, decimal_list) : (Int , List . List < Char > )) : Float {
210+ let n_of_decimals = Float . fromInt(List . size(decimal_list));
209211
210- let isNegative = num < 0 ;
212+ let num = Float . fromInt(n);
213+ let decimals = Float . fromInt(listToNat(decimal_list)) / (10 ** n_of_decimals);
211214
212- let float = if (isNegative) {
213- num - decimals;
214- } else {
215- num + decimals;
216- };
215+ let isNegative = num < 0 ;
216+
217+ let float = if (isNegative) {
218+ num - decimals;
219+ } else {
220+ num + decimals;
221+ };
222+
223+ float;
224+ },
225+ );
226+ };
217227
218- #Float (float);
228+ private func parseFloatWithExp() : P . Parser < Char , Float > = C . map(
229+ C . seq(
230+ C . oneOf([
231+ parseFloat(),
232+ C . map(
233+ C . Int . int(),
234+ func (i : Int ) : Float = Float . fromInt(i),
235+ ),
236+ ]),
237+ C . right(
238+ C . oneOf([C . String . string("e" ), C . String . string("E" )]),
239+ C . Int . int(),
240+ ),
241+ ),
242+ func ((n, exponent) : (Float , Int )) : Float {
243+ let exp = Float . fromInt(exponent);
244+ n * (10 ** exp);
219245 },
220246 );
221247
0 commit comments