如何使用 sprintf 将整数格式化为逗号作为千位分隔符

Sco*_*son 8 f# inline

如何使用 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:未定义字段、构造函数或成员“写入”。

如果我能修复这个错误,那么这可能是最直接的解决方案,当与部分应用程序结合时,将像内置版本一样简洁。

Joe*_*ler 6

由于您无法使用 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)


Guy*_*der 2

这可行,但应该有一个更简单的方法。

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)

  • 首先,使用 F# 格式说明符无法做到这一点。其次,很抱歉让您失望,但 F# 格式函数确实使用了底层的 .NET FW 库,特别是“TextWriter”。实际上,您可以使用格式说明符“%t”或“%a”直接连接到底层“TextWriter”。 (5认同)