[.NET]不同語系程式的除錯方式

程式只在某個國家會發生錯誤嗎?
在建立VM來測試前,可以先改 Culture 來試看看能不能重現錯誤哦!

環境: .NET Windows Form

 

今天同事問說在大陸地區的使用者在使用系統時,會發生以下的錯誤訊息,

Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble <System.FormatException> Input string was not in a correct format.
at Microsoft.VisualBasic.CompilerServices.Symbols+Container.InvokeMethod <System.InvalidCastException> Conversion from string "0:" to type 'Integer' is not valid.

 

而程式的錯誤是發生在一個將日期時間變數轉成字串的 Method 。

所以如果要讓錯誤重現的話,就是建立一個簡體的VM來測試。

或是在執行程式前,將目前的 Culture 改成是簡體的,如下,


System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-CN");

 

再執行程式,果然重現 User 的錯誤。

那 0: 是什麼呢?

原來我們的程式要將 DateTime 變數轉成字串時,會取 小時 出來比較。

例如 2015/01/01 轉出來就是 2015/1/1 上午 12:00:00


DateTime myDate = DateTime.Parse("2015/01/01");
Console.WriteLine("zh-TW:{0}", myDate.ToString("G"));

 

但如果,將 Culture 改成 zh-CN 的話,轉出來的值就是 2015/1/1 0:00:00


System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-CN");
DateTime myDate = DateTime.Parse("2015/01/01");
Console.WriteLine("zh-CN:{0}", myDate.ToString("G"));

 

而程式裡固定是取2碼,原本預期是取到 小時 的2位,所以就取到了 0:。

所以有找到問題點就可以進行修改了。

如果大家有類似的問題,也可以先修改 Culture 試看看哦!

 

參考資料

DateTime.ToString 方法 (String, IFormatProvider)

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^