2015年7月29日 星期三

try-catch -finally 之finally之特別用處

為什麼需要寫 finally那段

try
{

}
 catch (Exception e)

         
}
finally
{
       DoSomeClose();
}


如果寫成

try
{

}
 catch (Exception e)

         
}


DoSomeClose();

不也一樣嗎?我就是要在try catch之後去執行DoSomeClose();
事實上確實不同,finally確實有其特別之處

少了他,如果try或catch之中,有直接寫了return
那就不會執行DoSomeClose();

finally則會強制在你即便要return跳離開這段程式碼之前,也會先執行finally裡面的程式的



2015年7月15日 星期三

多國語言小數點符號處理

撰寫多國語系的軟體,必須注意到一些特殊處理事項
本篇所針對的數值呈現問題,將可能造成很嚴重的後果

首先,先明白數值表示法這件事情,在某些歐洲或美洲、東南亞地區數值的小數點符號,並不是「.」,而是「,」,所以當你的程式輸出檔案或者顯示在主控台的時候,會出現312.566被顯示成312,566 這種情形。如下圖的 fValue




這樣的狀況並不只是看起來怪怪的而已,更嚴重的是,如果你要下SQL指令,而且你的指令並不是透過SqlCommand物件的正規使用方式來進行,而是自己串出SQL指令的話,就會讓指令失敗,由於你的數值如果帶有小數點,會變成逗號,這會讓SQL指令被誤解析。

比方
sb.Append("INSERT INTO TB_RECORD_RAW VALUES (").Append(intIoId).Append(",").Append(douValue).Append(");”).
原本預期輸出
INSERT INTO TB_RECORD_RAW VALUES ( 123, 194.566 );
但結果會輸出
INSERT INTO TB_RECORD_RAW VALUES ( 123, 194,566 );
這會讓SQL誤判有三個參數要Insert,但是實際上只有兩個。結果要不就是填錯欄位,要不就會新增失敗(也許欄位不夠多)。


解決這個問題有兩種方式,要不就是透過SqlCommand物件的正規使用方式來進行。要不就是透過修改數值顯示方式(各國有各種特定的表示方式,可以在程式中強制統一),底下針對修改數值顯示方式來介紹。

CultureInfo TheCulture = new CultureInfo("en-US", false);
NumberFormatInfo NumFmtInf = TheCulture.NumberFormat;
NumFmtInf.NumberDecimalSeparator = ".";
NumFmtInf.NumberDecimalDigits = 10;

Double TestDot_ Double = 123.4567;
String Str_Result = String.Format(TheCulture, "{0:F}", TestDot_Double);

透過CultureInfo所建立的物件,會存放著作業系統的文化語言相關設定,指定為"en-US"是美國 “zh-TW則是台灣所有語言列表於http://www.csharp-examples.net/culture-names/


也可以客制化的修改小數點符號,也可指定浮點數一律顯示到小數點後第幾位,這邊稍微要注意的是,當你在此指定了小數點後第幾位,則不足位數會補零,比方123.4567000000。如果不設定呢,則預設會顯示小數點兩位,進行四捨五入。