如何使用 sprintf 格式化整数以将逗号显示为千位分隔符?
我知道如何使用 String.Format 做到这一点,但我找不到使用 sprintf 做到这一点的方法。
编辑:根据下面 Fyodor Soikin 的评论,我尝试了以下代码:
printf "%a" (fun writer (value:int) -> writer.Write("{0:#,#}", value)) 10042
let s = sprintf "%a" (fun writer (value:int) -> writer.Write("{0:#,#}", value)) 10042
Run Code Online (Sandbox Code Playgroud)
printf 调用有效(但写入标准输出,而我想获得一个字符串,我可以分配给 WPF 控件的 Text 或 Content 属性,例如)。
sprintf 调用失败,错误为 FS0039:未定义字段、构造函数或成员“写入”。
如果我能修复这个错误,那么这可能是最直接的解决方案,当与部分应用程序结合时,将像内置版本一样简洁。
由于您无法使用 Printf 模块执行此操作,因此我这样做:
/// Calls ToString on the given object, passing in a format-string value.
let inline stringf format (x : ^a) =
(^a : (member ToString : string -> string) (x, format))
Run Code Online (Sandbox Code Playgroud)
然后这样称呼它:
someNumber |> stringf "N0"
Run Code Online (Sandbox Code Playgroud)
这可行,但应该有一个更简单的方法。
let thousands(x:int64) =
System.String.Format("{0:#,0}", x)
let s = sprintf "%s" (thousands(0L))
printfn "%s" s
let s = sprintf "%s" (thousands(1L))
printfn "%s" s
let s = sprintf "%s" (thousands(1000L))
printfn "%s" s
let s = sprintf "%s" (thousands(1000000L))
printfn "%s" s
0
1
1,000
1,000,000
Run Code Online (Sandbox Code Playgroud)
稍微好一点的版本
let printNumber (x : int) : string =
System.String.Format("{0:N0}",x)
Run Code Online (Sandbox Code Playgroud)