diff --git a/lib/js/runtime.sx b/lib/js/runtime.sx index ecfd6c87..e7fd4ebc 100644 --- a/lib/js/runtime.sx +++ b/lib/js/runtime.sx @@ -1195,7 +1195,52 @@ ((js-number-is-nan n) "NaN") ((= n (js-infinity-value)) "Infinity") ((= n (- 0 (js-infinity-value))) "-Infinity") - (else (str n))))) + (else (js-normalize-num-str (str n)))))) + +(define + js-normalize-num-str + (fn + (s) + (let + ((ei (js-find-exp-char s))) + (if + (< ei 0) + s + (let + ((mant (js-string-slice s 0 ei)) + (expraw (js-string-slice s (+ ei 1) (len s)))) + (str mant "e" (js-strip-leading-zeros expraw))))))) + +(define + js-strip-leading-zeros + (fn + (s) + (let + ((sign-and-body (js-split-sign s))) + (let + ((sign (nth sign-and-body 0)) (body (nth sign-and-body 1))) + (let + ((stripped (js-strip-zeros-loop body 0 (len body)))) + (if (= stripped "") (str sign "0") (str sign stripped))))))) + +(define + js-split-sign + (fn + (s) + (cond + ((= s "") (list "" "")) + ((= (char-at s 0) "-") (list "-" (js-string-slice s 1 (len s)))) + ((= (char-at s 0) "+") (list "" (js-string-slice s 1 (len s)))) + (else (list "" s))))) + +(define + js-strip-zeros-loop + (fn + (s i n) + (cond + ((>= i n) "") + ((= (char-at s i) "0") (js-strip-zeros-loop s (+ i 1) n)) + (else (js-string-slice s i n))))) (define js-add