如何在 Rust 中更改格式化程序的小数点分隔符?

r03*_*r03 6 localization rust

下面的函数结果为“10.000”。我住的地方这意味着“一万”。

format!("{:.3}", 10.0);
Run Code Online (Sandbox Code Playgroud)

我希望输出为“10,000”。

lje*_*drz 5

由于标准库没有这个功能(数字格式的本地化),你可以用逗号替换点:

fn main() {
    println!("{}", format!("{:.3}", 10.0).replacen(".", ",", 1));
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以做到这一点,但这可能是最直接的解决方案。

  • 我讨厌这个解决方案,但我想我现在别无选择:-) (3认同)

Mat*_* M. 5

Rust 标准库不支持国际化 (i18n) 或本地化 (l10n)。


有几个原因,没有特定的顺序:

  1. 与语言环境相关的输出应该是有意识的选择,而不是默认值,
  2. i18n 和 l10n 比格式化数字要复杂得多,
  3. Rust std 的目标是小。

format!机器将用于编写 JSON 或 XML 文件。您真的不想根据编码它的机器的区域设置以不同格式的文件结束。这是灾难的秘诀。

在运行时检测区域设置也是优化不友好的。突然之间,您无法在编译时(甚至部分地)预先计算事物,甚至无法知道在编译时分配的缓冲区大小。

这与可疑的用途有关。日期和数字可以说很重要,但是这场美式与英式格式大战最终只是沧海一粟。法语语法学校的学生当然会欣赏数字以典型的法语格式进行格式化……但如果周围的文本是英语,对她来说就无济于事(众所周知,我们法语在教/学外语方面很糟糕)。区域设置应该影响语言选择、​​排序顺序等......仅仅改变数字格式是没有意义的,一切都应该随之切换,这需要更认真的支持(检查gettext提供良好基础的 C 库)。

基于主机语言环境的语言环境检测,并且它对整个过程是全局的,在这个多线程 Web 服务器时代也是一个非常可疑的架构选择。想象一下,如果 Facebook 在欧洲以瑞典语提供服务,仅仅因为它的数据中心在那里运行。

最后,所有这些语言/日期/...支持都需要大量数据。ICU内部嵌入了数十(或数百?)MB 的此类数据。这会使体积std爆炸,并使其完全不适合嵌入式开发;反正这可能不关心这个。

当然,如果您只选择支持少数语言,则可以显着减少这一点……这是将其置于标准库之外的另一个论据。

  • 当然,但 OP 并没有谈到 `std`:可能有一些官方的 extern crate 用于国际化,由 Rust 团队烘焙。关于*不*将这些东西放在`std`中,您是对的IMO,但是要以现代语言进行开发,这必须存在于某处。 (3认同)
  • @Boiethios:我听到了你的声音……但不幸的是,SO 格式并不适合推荐图书馆。最值得注意的是,由于答案的惯性,这意味着从现在起 2 年后,最佳答案可能指的是一个死图书馆(这是要求此类参考的问题被关闭的原因,顺便说一句)。因此,我更愿意将自己限制在解释为什么标准库不提供它;这让 OP 可以货比三家,而不是尝试等待标准解决方案(在 crates.io 上搜索“locale”,在 IRC/Reddit/用户论坛/...上提问)。 (3认同)