以运行时可选择的精度打印浮点数
printing a float with runtime-selectable precision
这与 this question 相似,但不完全相同。
我天真地尝试了这个:
let s prec = "%." ^ (string_of_int prec) ^ "f" in
Printf.printf (s 2) 1.23
但这被拒绝了,并且用^^
替换了^
。有什么办法吗?
由于格式字符串是类型安全的,因此在编译时应该知道它们。您不能采用任意字符串并将其用作格式字符串。这个限制仍然允许你从片段构建格式,你只是不应该忘记调用 format_of_string
函数,并确保你所有的格式都是静态的,并且生成的格式具有相同的类型。
但是,格式已经解决了您的具体情况,因此您无需在此处做任何花哨的事情。有 *
说明符,它完全符合您的要求:
# printf "%.*f" 10 1.0;;
1.0000000000- : unit = ()
# printf "%.*f" 1 1.0;;
1.0- : unit = ()
还有 Scanf.format_from_string
允许您从动态字符串构建任意格式。以下程序展示了 OCaml 格式的灵活性:
let () =
print_endline "Floating point format: ";
let f = match read_line () with
| "engineering" -> "%e"
| "regular" -> "%f"
| "pretty" -> "%g"
| user -> user in
let fmt =
try Scanf.format_from_string f "%f"
with exn -> invalid_arg "Unrecognized format" in
Printf.printf (fmt^^"\n") (4. *. atan 1.)
示例:
ivg$ ocaml formats.ml
Floating point format:
pi = %.16f
pi = 3.1415926535897931
这与 this question 相似,但不完全相同。
我天真地尝试了这个:
let s prec = "%." ^ (string_of_int prec) ^ "f" in
Printf.printf (s 2) 1.23
但这被拒绝了,并且用^^
替换了^
。有什么办法吗?
由于格式字符串是类型安全的,因此在编译时应该知道它们。您不能采用任意字符串并将其用作格式字符串。这个限制仍然允许你从片段构建格式,你只是不应该忘记调用 format_of_string
函数,并确保你所有的格式都是静态的,并且生成的格式具有相同的类型。
但是,格式已经解决了您的具体情况,因此您无需在此处做任何花哨的事情。有 *
说明符,它完全符合您的要求:
# printf "%.*f" 10 1.0;;
1.0000000000- : unit = ()
# printf "%.*f" 1 1.0;;
1.0- : unit = ()
还有 Scanf.format_from_string
允许您从动态字符串构建任意格式。以下程序展示了 OCaml 格式的灵活性:
let () =
print_endline "Floating point format: ";
let f = match read_line () with
| "engineering" -> "%e"
| "regular" -> "%f"
| "pretty" -> "%g"
| user -> user in
let fmt =
try Scanf.format_from_string f "%f"
with exn -> invalid_arg "Unrecognized format" in
Printf.printf (fmt^^"\n") (4. *. atan 1.)
示例:
ivg$ ocaml formats.ml
Floating point format:
pi = %.16f
pi = 3.1415926535897931