2017-06-15 44 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

相關問題