// The format-specification mini-language, one flag at a time.
//
// moon run src/examples/05-format
///|
fn main raise {
let n = @moonnum.parse_int("1234567")
// Width, fill and alignment.
println("width and alignment")
println("|" + @moonnum.format_int(n, "15d") + "|")
println("|" + @moonnum.format_int(n, "<15d") + "|")
println("|" + @moonnum.format_int(n, "^15d") + "|")
println("|" + @moonnum.format_int(n, "*^15d") + "|")
println("|" + @moonnum.format_int(n, "0>15d") + "|")
// Sign, and the zero flag, which pads after the sign and before the digits.
println("")
println("sign and zero padding")
println("|" + @moonnum.format_int(n, "+15d") + "|")
println("|" + @moonnum.format_int(-n, "+15d") + "|")
println("|" + @moonnum.format_int(n, "015d") + "|")
println("|" + @moonnum.format_int(-n, "015d") + "|")
println("|" + @moonnum.format_int(n, " 15d") + "|")
// Thousands separators, and what happens when zero padding meets them.
println("")
println("grouping")
println(@moonnum.format_int(n, ",d"))
println(@moonnum.format_int(n, "_d"))
println(@moonnum.format_int(n, "015,d"))
println(@moonnum.format_int(@moonnum.parse_int("255"), "_b"))
println(@moonnum.format_int(@moonnum.parse_int("255"), "#010_x"))
// Every presentation type for integers.
println("")
println("types")
for type_char in ["b", "o", "d", "x", "X", "n", "c"] {
let spec = if type_char == "c" {
@moonnum.format_int(@moonnum.parse_int("65"), type_char)
} else {
@moonnum.format_int(@moonnum.parse_int("255"), type_char)
}
println(" \{type_char}: \{spec}")
}
// Floats: precision means digits after the point for `f`, significant digits
// for `g`, and always an exponent for `e`.
println("")
println("float types")
let x = 1234.5678
println(" value: \{x}")
for spec in ["f", ".2f", "e", ".3e", "g", ".3g", "%", ".1%", ",.2f"] {
println(" \{spec}: \{@moonnum.format_float(x, spec)}")
}
println(" .2% of 0.25: \{@moonnum.format_float(0.25, ".2%")}")
// The alternate form keeps zeros that `g` would drop, and always keeps the
// decimal point.
println("")
println("alternate form")
println(" g of 1.5: " + @moonnum.format_float(1.5, "g"))
println(" #g of 1.5: " + @moonnum.format_float(1.5, "#g"))
println(" g of 2.0: " + @moonnum.format_float(2.0, "g"))
println(" #g of 2.0: " + @moonnum.format_float(2.0, "#g"))
println(" #.0f of 2.0: " + @moonnum.format_float(2.0, "#.0f"))
// `z` turns a negative zero into a zero, which is what a fixed-point table
// wants when the value rounds away.
println("")
println("negative zero")
println(" -0.0 -> " + @moonnum.format_float(-0.0, ""))
println(" -0.0 z -> " + @moonnum.format_float(-0.0, "z"))
println(" -.0001 z.2f -> " + @moonnum.format_float(-0.0001, "z.2f"))
// One entry point, whatever the number happens to be.
println("")
println("one entry point")
for text in ["42", "-0.5", "22/7", "3+4j"] {
let value = @moonnum.parse(text)
println(" \{text} -> " + @moonnum.format(value, ".3f"))
}
}