fun pow10 n =
    if n <= 0 then
        1
    else
        10 * pow10 (n - 1)

fun pad len s =
    let
        fun pad' len s =
            if len <= 0 then
                s
            else
                pad' (len - 1) ("0" ^ s)

        val len' = String.length s
    in
        if len' >= len then
            s
        else
            pad' (len - len') s
    end

fun format pl f =
    let
        val whole = trunc f
        val p10 = pow10 pl
        val frac = trunc (f * float p10) % p10
    in
        if frac = 0 then
            show whole
        else
            show whole ^ "." ^ pad pl (show frac)
    end