def dec.exact

yaml-for-bend@0.1.1.0 · num.bend:195

import yaml-for-bend@0.1.1.0/num.bend as Num
import Base

195# The value of a decimal literal ("1_000.5" without the "_", ".5", "1.",
196# "2.5e-3"), written exactly: "1000.5", "0.5", "1.0", "0.0025". Past what a
197# double holds it is ".inf"; under, zero.
198def dec.exact(+s: String) -> String:
199  +neg = String.starts_with(s, "-")
200  +body = Bool.pick(String, Bool.or(neg, String.starts_with(s, "+")), String.drop(s, 1n), s)
201  +ip = take.digits(body)
202  +fp = take.digits(after.dot(body))
203  +e = exp.read(after.e(body))
204  +all = ip ++ fp
205  +lead = Nat.sub(String.length(all), String.length(drop.zeros(all)))
206  +ds = strip.end.zeros(drop.zeros(all))
207  +point = Nat.sub(point.at(String.length(ip), e), lead)
208  +sign = Bool.pick(String, neg, "-", "")
209  when(String, Bool.and(Bool.not(String.is_empty(ds)), Nat.is_gt(point, Nat.add(dec.off(), 309n))), u => sign ++ ".inf",
210    u => when(String, Bool.or(String.is_empty(ds), Nat.is_lt(Nat.add(point, 330n), dec.off())), u => sign ++ "0.0",
211      u => sign ++ dec.place(ds, point, dec.off())))

Uses (24)

Used by (3)