.NET Core專案(.NET Framework沒出現)在阿拉伯語(即語言名稱是ar-
開頭的語言)環境下,將負數位符串轉成數位,即int.Parse("-1")
或Convert.ToInt32("-1")
時,會丟擲異常「Input string was not in a correct format.」
使用過載方法,int.Parse("-1",CultureInfo.InvariantCulture)
或Convert.ToInt32("-1",CultureInfo.InvariantCulture)
========================= 分界線 ======================
下面記錄一下踩坑的經過
基於ABP框架開發的專案,測試服切換多語言時報500錯誤,當切到阿拉伯語相關語言(即ar-
開頭的語言)時報錯,但是本地跑正常的
CSRedis
丟擲的異常,而本地偵錯時,未連線redis
伺服器,初步猜測,是redis
出了問題CSRedis
的程式碼有問題,看紀錄檔中的"Input string was not in a correct format."就是CSRedis丟擲的,CSRedis是一個開源專案,CSRedis原始碼地址CultureInfo.CurrentCulture
和CultureInfo.CurrentUICulture
獲取到的是zh-hans
,猜測如果把zh-hans
改成ar-ER
(阿拉伯語的一種)是不是就會報錯?CultureInfo.CurrentCulture
和CultureInfo.CurrentUICulture
改成ar-ER
之後,果然報錯出現了(終於看到了勝利的曙光,此時我已經被這個問題搞了3-4天了。。。)Int64.Parse(line.Tostring())
時報錯"Input string was not in a correct format.",並且是微軟報出來的(給CSRedis道歉,立刻,馬上。。。),此時line.Tostring()
的值是"-1"(下面是CSRedis原始碼中的片段)Int64.Parse("-1")
,果不其然,除此之外Int16.Parse("-1")
、Int32.Parse("-1")
、Convert.ToInt64("-1")
、Convert.ToInt32("-1")
等,將負數位符串轉成數位的方法,都會報錯,這個就是最終結論CultureInfo.InvariantCulture
引數,即不匹配任何文化資訊,參考官方檔案CultureInfo
說起,其中有一個屬性NumberFormat
,包含了當前語言的數位格式,可參考官方檔案,NumberFormatInfo
型別中NegativeSign
用於定義負號