是否可以在Rust中打印一个用千位分隔符格式化的数字?

Cab*_*ero 15 rust

例如

println!("{}", 10_000_000);
Run Code Online (Sandbox Code Playgroud)

结果是

10000000
Run Code Online (Sandbox Code Playgroud)

而我想把它格式化为类似的东西

10,000,000
Run Code Online (Sandbox Code Playgroud)

我浏览fmt模块文档,但没有什么可以涵盖这种特殊情况.我认为这样的事情会起作用

println!("{:,i}", 10_000_000);
Run Code Online (Sandbox Code Playgroud)

但它会引发错误

invalid format string: expected `}`, found `,`
Run Code Online (Sandbox Code Playgroud)

Kap*_*lan 16

使用千位分隔符 \xe2\x80\x93 格式化数字的最简单方法,但不使用语言环境
\n使用thousandscrate

\n
use thousands::Separable;\n\nprintln!("{}", 10_000_000.separate_with_commas());\n
Run Code Online (Sandbox Code Playgroud)\n
\n


仅使用 Rust std 库的单行代码

\n
let num = 10_000_000.to_string()\n    .as_bytes()\n    .rchunks(3)\n    .rev()\n    .map(std::str::from_utf8)\n    .collect::<Result<Vec<&str>, _>>()\n    .unwrap()\n    .join(",");  // separator\n
Run Code Online (Sandbox Code Playgroud)\n

Playground包含一个增强的解决方案,还可以格式化负数

\n


Tom*_*Tom 9

num_format箱子会为你解决这个问题。添加您的语言环境,它会发挥作用。


Man*_*rth 5

没有,而且可能不会。

根据你在哪里上,千位分隔符也可以像工作1,00,00,000,或1.000.000,000和其他一些变种。

本地化不是stdlib的工作,而且format!大多数情况是在编译时处理的(尽管公平地说,可以轻松地将其放置在其运行时部分中),并且您不想将语言环境硬烘焙到程序中。

  • “本地化不是stdlib的工作”,这值得商de。我当然不同意它,尽管我会说它还不适合作为标准库的一部分。 (10认同)
  • 可以指定每组和分隔符的位数。例如,由_分隔的4个组将为二进制或十六进制数字提供良好的输出格式。(据我所知,意大利语也使用三位数的组,而不是上面提到的不规则格式。) (4认同)
  • 废话。应该有一个format!()字符串,上面写着“每x个数字添加此分隔符”,就像我们告诉format!()的方法一样,它要添加一个小数点,要显示的小数位数和要填充的零位数。 (3认同)
  • @starblue 在印度和南亚其他地方使用“不规则格式”。这不是小众的东西。 (2认同)