前言
最近因為工作關係,有開發到部分和越南相關的東西,也因此踩了坑QQ今天就來跟大家簡單分享一下吧!
你掉的是金斧頭還是銀斧頭?
因為文化特性不同,所以使用xxx.TryParse就會造成不同的結果。在越南文化裡,小數點代表百分位符號,而逗號才是代表小數點。這跟我們常見的zh-TW是完全相反的。如果上面文字看不懂,我們就來看看程式碼實際例子
沒關係懶得看程式碼嗎?幫大家整理一個懶人包表格!
輸入值 | decimal.TryParse() 結果zh-TW | decimal.TryParse() 結果vi-VN |
---|---|---|
1.87 | 1.87 | 187 |
1,87 | 187 | 1.87 |
我明明輸入的東西是一樣的,但卻因為文化特性而有不同結果,這不是我要的RRRRR。因為目前資料都已經是以zh-TW的文化特性為主,所以希望即便加上越南相關的開發項目,我存在DB的資料還是也要以zh-TW的文化特性為主。
小朋友才做選擇,我全部都要!
為了解決上述問題,但又要做轉換,其實decimal.TryParse & decimal.Parse有個多載就可以解決這個問題了!讓我們繼續往下看吧!
decimal.TryParse(String, NumberStyles, IFormatProvider, out Decimal)
參數說明
- string ⇒ 你要轉換的內容
- NumberStyle ⇒ 決定數值字串引數中允許的樣式,像是這次會用到的就是AllowDecimalPoint,指示數值字串可以有小數點
- IFormatProvider ⇒ 這就是本次重頭戲!提供字串相關特定文化特性剖析資訊,雖然文件是寫要帶入IFormatProivder這個參數,但因為CultureInfo會實作IFormateProvider,所以參數內容也可以直接用CultureInfo這個物件,其中會用到InvariantCulture的屬性。CultureInfo.InvariantCulture會取得與文化特性無關的CultureInfo物件,意思就是說當放上這個參數時,在decimal.TryParse的時候就不會管你的文化特性是哪個,就會直接進行轉換。來看看結果吧
decimal.Parse也有類似的多載,但因為太相似就不贅述了~只要用上CultureInfo.InvariantCulture就可以解決前面的問題啦!
結論
其實做越南相關的開發真的是踩到很多有的沒的文化轉換問題,頭真的好痛R(謎之音:頭痛就去吃頭痛藥)但也算是另類踩坑啦~那就下次見掰掰