下面的函数结果为“10.000”。我住的地方这意味着“一万”。
format!("{:.3}", 10.0);
Run Code Online (Sandbox Code Playgroud)
我希望输出为“10,000”。
由于标准库没有这个功能(数字格式的本地化),你可以用逗号替换点:
fn main() {
println!("{}", format!("{:.3}", 10.0).replacen(".", ",", 1));
}
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以做到这一点,但这可能是最直接的解决方案。
Rust 标准库不支持国际化 (i18n) 或本地化 (l10n)。
有几个原因,没有特定的顺序:
该format!机器将用于编写 JSON 或 XML 文件。您真的不想根据编码它的机器的区域设置以不同格式的文件结束。这是灾难的秘诀。
在运行时检测区域设置也是优化不友好的。突然之间,您无法在编译时(甚至部分地)预先计算事物,甚至无法知道在编译时分配的缓冲区大小。
这与可疑的用途有关。日期和数字可以说很重要,但是这场美式与英式格式大战最终只是沧海一粟。法语语法学校的学生当然会欣赏数字以典型的法语格式进行格式化……但如果周围的文本是英语,对她来说就无济于事(众所周知,我们法语在教/学外语方面很糟糕)。区域设置应该影响语言选择、排序顺序等......仅仅改变数字格式是没有意义的,一切都应该随之切换,这需要更认真的支持(检查gettext提供良好基础的 C 库)。
基于主机语言环境的语言环境检测,并且它对整个过程是全局的,在这个多线程 Web 服务器时代也是一个非常可疑的架构选择。想象一下,如果 Facebook 在欧洲以瑞典语提供服务,仅仅因为它的数据中心在那里运行。
最后,所有这些语言/日期/...支持都需要大量数据。ICU内部嵌入了数十(或数百?)MB 的此类数据。这会使体积std爆炸,并使其完全不适合嵌入式开发;反正这可能不关心这个。
当然,如果您只选择支持少数语言,则可以显着减少这一点……这是将其置于标准库之外的另一个论据。