Q:設置好的NumberFormatInfo的實例應該怎麼使用?
A:NumberFormatInfo是IFormatProvider接口的一個實現,你可以把NumberFormatInfo的實例作為參數傳遞給對應的重載方法。
Q:那麼,Customerize Regional Options(自定義區域選項)中Numbers(數字)選項卡裡的設定是否也能通過NumberFormatInfo的對應屬性來設置?
A:不全是,其中Display leading zeros(零起始顯示)、List separator(列表分隔符)、Measurement system(度量衡系統)這三項沒有;Negative number format(負數格式)需要同時結合使用NumberFormatInfo的NegativeSign、NumberDecimalDigits、NumberDecimalSeparator等來設置;其他的都能在NumberFormatInfo中找到與之對應的屬性。
Q:那麼,Display leading zeros(零起始顯示)、List separator(列表分隔符)、Measurement system(度量衡系統)這三項在哪裡有對應的設置呢?
A:很抱歉,到目前為止我也找不到對應的地方來設置,如果你或者其他人找到了,請務必告訴我。(不過,你可以通過RegionInfo.IsMetric這個只讀屬性來檢測當前系統是否使用Metric(公制)度量系統。)
Q:如果我無法推斷待解析的字符串應該使用哪一個或多個NumberStyles枚舉呢?
A:這種情況一般不會發生,待解析的字符串肯定是有一定的目的或用途的,這些目的或用途就是字符串字面樣式的約束,而NumberStyles枚舉的作用就是說明這種約束的。當然,如果你目前確實無法推斷,那麼你可以使用NumberStyles.Any枚舉。
Q:在具體的編碼過程中,我如何知道應該選擇哪一種方法來解析字符串呢?
A:就我個人來說,我會:
首先,你得清楚你所使用的CLR版本是否提供某種方法的支持,例如,TryParse是.Net 2.0或以上才支持的。
其次,你可以通過方法的重載簽名來選擇,如果你要解析非十進制的字符串,Convert.ToInt32可能是你唯一的選擇,除了十進制和十六進制,你可以用它來解析二進制、八進制,但你不能用Int32.Parse或Int32.TryParse來解釋這些進制的字符串。當然如果是十進制或者十六進制就哪種方法都可以。
另外,如果你需要使用NumberStyles枚舉來告知相關方法待解析的字符串的樣式,那麼Convert.ToInt32就幫不了你了,此時你應該選擇Int32.Parse或者Int32.TryParse相應的重載。
再次,如果你不希望在你的代碼裡處理異常,那麼Int32.TryParse可能是你唯一的選擇,你可能根據它的返回至來判斷解析是否成功,進而決定是否使用解析結果。但如果你希望透過異常機制通知調用方解析失敗,那麼Int32.Parse或者Convert.ToInt32都是不錯的選擇。
最後,選擇准則不可能唯一或者通用的的,你可能會在實踐總結出適合你自己的選擇准則,如果你有更好的選擇方法,請你也告訴我一聲。
Q:在.Net裡面,如果要將string解析為其它的基元類型(Primitive Type)是否也有類似的方法?
A:是的,在.NET裡面,我們為這些基元類型提供了Convert.ToPrimitiveType、PrimitiveType.Parse、PrimitiveType.TryParse(.NET 2.0或以上)方法,用於把string解析成對應的基元類型,當然,你得首先保證待解析的string字面值與對應的基元類型兼容。這些基元類型是(括號中是對應的C#關鍵字):SByte (sbyte), Byte (byte), Int16 (short), UInt16 (ushort), Int32 (int), UInt32 (uint), Int64 (long) , UInt64 (ulong), Char (char), Single (float), Double (double) , Boolean (bool), Decimal (decimal)。另外,.Net也提供了把string解析為DateTime結構的方法,除了有上面提到的三種形式(Convert.ToDateTime、DateTime.Parse、DateTime.TryParse)之外,我們還可以使用DateTime.TryParseExact。所有的這些方法都是大同小異,差別在於對字符串字面值格式(包括其所包含符號)的規定,有興趣的話,你可以參考以下MSDN的文檔或者其他專題資料。