程式只在某個國家會發生錯誤嗎?
在建立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:從零開始的軟體開發生活」
請大家繼續支持 ^_^