[英]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.