我有一些解析字符串的代碼,當一個字符串爲空時,拋出異常。我想讓程序仍然將空字符串轉換爲零而不修改解析代碼。我怎麼做?如何使默認System.Convert(數字)方法將空字符串識別爲零?
UPD:我知道,如果我有幾行代碼,我應該String.IsNullOrEmpty
檢查輸入的字符串,但我有近百項Convert.ToInt32
和Convert.ToInt16
線,所以我真的想解決這個其他一些就像寫一個擴展方法什麼的。
我有一些解析字符串的代碼,當一個字符串爲空時,拋出異常。我想讓程序仍然將空字符串轉換爲零而不修改解析代碼。我怎麼做?如何使默認System.Convert(數字)方法將空字符串識別爲零?
UPD:我知道,如果我有幾行代碼,我應該String.IsNullOrEmpty
檢查輸入的字符串,但我有近百項Convert.ToInt32
和Convert.ToInt16
線,所以我真的想解決這個其他一些就像寫一個擴展方法什麼的。
由於ChaosPandion的回答(基於他的代碼),我想出如何使一個快速檢查和轉換。它還有助於減少代碼更改,只從中刪除Convert.
。
下面是INT的方法:
public static Int32 StringToInt32(string str)
{
if (string.IsNullOrEmpty(str))
return 0;
else
return Convert.ToInt32(str);
}
所有'Convert.ToInt32'確實是檢查'str'是否爲空,返回'0',否則調用'Int32.Parse(str)',所以這個檢查已經在你的方法可以直接調用'Int32.Parse(str)'。 – MCattle
String x = "";
int val =0;
if(x != String.Empty){
if(Integer.TryParse(x)){
val = Convert.ToInt32(x)
}else{
///Exception
}
}
Use val variable here
這不能做而不改變(或與此觀察到的投擲FormatException
的行爲的其他轉換方法)傳遞到Convert.ToInt32
的值。
如果只是是造成問題,則三元條件操作者可以很方便的空字符串:
int num = !string.IsNullOrEmpty(input)
? Convert.ToInt32(input)
: 0;
(Convert.ToInt32(null)
實際上將評估爲0就好了,但它僅僅是爲有效處理這種情況下,我們自己..)
當然,這仍然將打破像"foo"
和諸如此類的東西輸入值..
錯字在您的IsNullOrEmpty – MethodMan
如果字符串不可解析?例如input =「Something」 –
@DJKRAZE修正:-) – 2012-08-22 21:44:57
我會做這樣的事情:
Convert.ToInt32(String.IsNullOrEmpty(myStr) ? "0" : myStr)
另一個想法是使用:
int res;
Int32.TryParse("", out res);
TryParse
將失敗並返回false,但是res
將被設置爲0,結果爲out
參數必須初始化。
您確實沒有太多的選擇來避免更改Convert.Int32
的「近一百個」實例。使用Steve's extension method technique將是相當直接的,但你必須通過每一個電話,並在最後添加.EmptyToNumber()
。
你也可以做一個全球查找和Visual Studio中替換與SafeConvert.ToInt32(
取代Convert.ToInt32(
,然後實現靜態類SafeConvert
作爲包裝。這應該是相當安全的。
我能想到的最好的事情是
int number = System.Convert.ToInt32("".EmptyToNumber());
其中EmptyToNumber是字符串
public static string EmptyToNumber(this string input)
{
return (string.IsNullOrEmpty(input) ? "0" : input);
}
這種擴展方法,但是,將需要在搜索大家Convert.ToInt32的您的代碼並將擴展名EmptyToNumber添加到作爲參數傳遞的現有字符串中。
我認爲這裏適當的行動是應用一種不同的技術,而不是期待框架爲你改變。嘗試使用下面的代碼來創建字符串實例的擴展方法。
public static class ConversionExtensions
{
public static int? ToInt32(this string input)
{
int value;
if (!int.TryParse(input, out value) && !string.IsNullOrEmpty(input))
{
// this is some weird input that
// I may need to handle
return null;
}
return value;
}
}
如果你熟悉正則表達式,你可以不喜歡以下
public static bool IsNumeric(string text)
{
return string.IsNullOrEmpty(text) ? false :
Regex.IsMatch(text, @"^\s*\-?\d+(\.\d+)?\s*$");
}
你說當字符串爲空拋出一個異常?所以趕上例外。
int myvar = 0;
try {
myvar = myParseMethod(input); // call your parse method here
}
catch (MyEmptyStringException ex) {
// Keep going
}
我不會推薦這個。總是要求一個try-catch的重語法是不可讀的。 – ChaosPandion
@ChaosPandion同意,我不想在任何地方使用它,只是纏繞主分析例程。 –
這不完全是主題。 – user1306322
你可以顯示代碼..?空字符串不應該正常拋出異常,除非你正在做一些奇怪類型的轉換..你看過IsNullOrEmpty ..嗎? – MethodMan
讓我明白。你想System.Convert.ToInt32(「」)返回0?在不更改名爲的方法名稱? – Steve
@DJKRAZE'Convert.ToInt32(「」)'會拋出一個FormatException,但是'Convert.ToInt32(null)'將返回0.不要問我爲什麼:) – 2012-08-22 21:40:02