2017-06-15 317 views
4

以下功能的结果为“10.000”。我住在哪里意味着“万”。如何在Rust中更改格式化程序的小数点分隔符?

format!("{:.3}", 10.0); 

我想输出为“10,000”。

+0

可能重复的[Rust:print/format number with thousand separator](https://stackoverflow.com/questions/26998485/rust-print-format-number-with-thousand-separator) – ljedrz

+0

@ljedrz不,这个OP明确要求浮动号码。你的问题是关于整数。 – Stargateur

+0

这个问题的答案也包含花车,但你是对的;这个问题并不完全重复。 – ljedrz

回答

4

由于标准库不具备此功能(数字格式的本地化),你可以用逗号代替点:

fn main() { 
    println!("{}", format!("{:.3}", 10.0).replacen(".", ",", 1)); 
} 

有这样做的其他方式,但是这可能是最直接的解决方案。

+0

我讨厌这个解决方案,但我想我现在别无选择:-) – r03

+0

我首先忘记了它的存在并试图自己实现它并相信我 - 这个实际上非常令人愉快;)。 – ljedrz

1

这不是宏的作用format!。这个选项应该由Rust处理。不幸的是,我的搜索引导我得出Rust不能处理区域设置的结论(但?)。

有一个库rust-locale,但他们仍然在阿尔法。

4

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


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

  1. 一个区域设置相关的输出应该是一个有意识的选择,而不是默认的,
  2. 国际化和本地化的绝不仅仅是更复杂格式化数字,
  3. Rust std的目标是小。

format!机器将用于编写JSON或XML文件。根据编码它的机器的区域设置,您真的不希望最终得到格式不同的文件。这是一个灾难的秘诀。

在运行时检测语言环境也是优化不友好的。突然间你不能在编译时(甚至是部分)预先计算东西,你甚至不知道在编译时要分配哪个缓冲区大小。

这与可疑的有用性有关。日期和数字可以说是非常重要的,但是这个美国与英国格式的战争最终是海洋中的一个下降。一个法国语法小学生肯定会理解,这个数字的格式是典型的法国格式......但如果周围的文本是英文的(我们法语在教/学外语方面差了很多),这对她来说无济于事。区域设置应该影响语言选择,排序顺序,等等......仅仅改变数字的格式是没有意义的,一切应该对其进行开关操作,这就需要更为严重支持(检查gettext一个C库,提供了良好的基础)。

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

最后,所有这些语言/日期/ ...支持需要大量的数据。 ICU有几十个(或者是几百?)嵌入其中的这种数据的MB。这将使std的大小爆炸,并使其完全不适合嵌入式开发;无论如何,这可能并不关心。

当然,如果您只选择支持少数几种语言,那么您可以大幅减少这个数量...这是将此置于标准库之外的另一个参数。

+2

当然,但是OP并没有提到'std':可能会有一些国际化的正式外部机构,由铁锈团队烘焙。你是正确的国际海事组织关于*不*将这些东西放在'std'中,但是要用现代语言开发,这必须存在某个地方。 – Boiethios

+3

@Boiethios:我听到你......但是SO格式不利于推荐库不幸。最值得注意的是因为答案中的惯性,这意味着从现在开始的2年,最高的答案可能指的是一个死去的图书馆(这就是要求这样的参考文献的问题被关闭的原因)。因此,我倾向于将自己局限于解释为什么标准库不提供它;这可以让OP免费购物,而不是尝试等待std解决方案(在crates.io上搜索“locale”,在IRC/Reddit /用户论坛上提问)。 –

+0

你是对的。当我回答某些问题时,我会考虑这个问题。 – Boiethios

相关问题