2
我想打一個通用的字符串,數字轉換器,並提供其作爲字符串的擴展,所以我寫了下面的代碼:如何使用Convert.ChangeType將字符串轉換爲具有組分隔符的數字?
public static bool TryParse<T>(this string text, out T result, IFormatProvider formatProvider) where T : struct
try
{
result = (T)Convert.ChangeType(text, typeof(T), formatProvider);
return true;
}
catch(...
我這樣稱呼它:
int value;
var ok = "123".TryParse(out value, NumberFormatInfo.CurrentInfo)
它的工作原理直到我想使用組分隔符: 因爲我住在法國,千位分隔符是空格,小數點分隔符是逗號,字符串「1 234 567,89」應該等於1234567.89(在不變式文化中)。但是,該功能崩潰!
當試圖執行非通用轉換,如double.Parse(...),
我可以使用接受NumberStyles參數的重載。我指定NumberStyles.Number,這次它的工作!
所以,問題是:
- 爲什麼解析不尊重我的NumberFormatInfo(其中我在操作系統中指定的NumberGroupSeparator被明確指定爲空格)
- 我怎麼可能讓工作具有Convert.ChangeTime的通用版本,因爲它沒有重載,它接受一個NumberStyles參數?
我嘗試了幾種文化,這是同樣的事情:有效的組分隔符的存在引發FormatException;儘管它適用於其他事情(小數點分隔符,日期和時間分隔符)。對於千位分隔符,您必須指定一個NumberStyles.AllowThousands值。但正如我之前所說,Convert.ChangeType沒有這種參數的重載。 – Loic 2010-03-08 12:37:10
它適用於雙打,但嘗試整數:它會失敗! 以下代碼拋出格式異常: VAR I =(int)的Convert.ChangeType( 「1 234」 的typeof(INT),新的培養物( 「FR-FR」); 下面的代碼工作: 變種d =(double)Convert.ChangeType(「1 234」,typeof(double),new Culture(「fr-FR」); – Loic 2010-03-10 13:27:37
@Loic:你是對的,也許Convert.ChangeType沒有在其實現中指定NumberStyles.AllowThousands 。關於它我們沒有太多可以做的,恐怕你必須自己處理它,而不使用Convert.ChangeType。 – 2010-03-10 14:05:00