簡體   English   中英

boost :: lexical_cast <>的Locale不變保證

[英]Locale invariant guarantee of boost::lexical_cast<>

我正在使用boost::lexical_cast<std::string>(double)將雙精度轉換為字符串,生成JSON序列化字節流,即(在遠程端)由.NET解析。

我能夠強制.NET使用InvariantCulture進行解析,從而在每種可能的語言上返回可預測的結果。

但是,我無法在boost :: lexical_cast文檔中找到此保證。 我嘗試了一下,它對於不同的語言環境設置的工作方式相同。 但是,我不能確定只有少數測試,我在文檔中遺漏了什么,或者這根本不能保證,我必須使用別的東西?

編輯:我發現了一個問題。

std::locale::global(std::locale("Czech")); 
std::cout << boost::lexical_cast<std::string>(0.15784465) << std::endl;

返回0,15784465 ,這是不受歡迎的。 我可以強制boost::lexical_cast<>不要知道語言環境嗎?

我可以強制boost :: lexical_cast <>不要知道語言環境嗎?

不,我不認為這是可能的。 你能做的最好的就是打電話

std::locale::global(std::locale::classic());

將全局語言環境設置為“C”語言環境,因為boost::lexical_cast依賴於全局語言環境。 但是,問題是如果代碼中的其他地方在調用boost::lexical_cast之前將全局語言環境設置為其他內容,那么您仍然遇到同樣的問題。 因此,一個強大的解決方案就是imbue一個像這樣的字符串流,你總能確定這是有效的:

std::ostringstream oss;
oss.imbue(std::locale::classic());
oss.precision(std::numeric_limits<double>::digits10);
oss << 0.15784465;

解決此問題的更好方法是使用boost :: locale而不是std :: locale作為globale語言環境。 文檔

設置全局語言環境有不好的副作用...它甚至影響printf和boost :: lexical_cast等庫提供不正確或意外的格式。 事實上,在這種情況下,許多第三方圖書館都被打破了。 與標准本地化庫不同,Boost.Locale從不更改基本數字格式,即使它使用基於std的本地化后端,因此默認情況下,數字始終使用C樣式語言環境進行格式化。 本地化數字格式需要特定標志。

Boost語言環境要求您明確指定何時希望數字格式設置為語言環境,這與最近的庫決策(如std :: money_put)更為一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM