js-on-sx: strip leading zeros from exponent in num→string (+3)

SX's (str 1e-7) gives "1e-07" but JS spec is "1e-7" — no padding, no
leading zeros in the exponent (sign stays). We stepped through:
  mant "e" expraw  →  mant "e" (sign (strip-zeros body))

Added four small helpers: js-normalize-num-str, js-split-sign,
js-strip-leading-zeros, js-strip-zeros-loop. All pure string walkers.

Unit 521/522, slice 148/148 unchanged.
String 40 → 42, Number 75 → 76 (+3 total).
Fixes S9.8.1_A9_T1, fromCharCode/S9.7_A3.1_T1..T2 family.
This commit is contained in:
2026-04-24 13:23:08 +00:00
parent 2af31248f2
commit b2810db1a0

View File

@@ -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