TryParse轉到亂七八糟


前言

最近因為工作關係,有開發到部分和越南相關的東西,也因此踩了坑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(謎之音:頭痛就去吃頭痛藥)但也算是另類踩坑啦~那就下次見掰掰


Reference

Decimal.TryParse 方法 (System))

#C# #decimal.TryParse






你可能感興趣的文章

What is Azure Release Pipeline

What is Azure Release Pipeline

箭頭函式 Arrow Function

箭頭函式 Arrow Function

Day05:從 class 看 bytecode

Day05:從 class 看 bytecode






留言討論