2012-08-22 65 views
0

我有一些解析字符串的代碼,當一個字符串爲空時,拋出異常。我想讓程序仍然將空字符串轉換爲零而不修改解析代碼。我怎麼做?如何使默認System.Convert(數字)方法將空字符串識別爲零?

UPD:我知道,如果我有幾行代碼,我應該String.IsNullOrEmpty檢查輸入的字符串,但我有近百項Convert.ToInt32Convert.ToInt16線,所以我真的想解決這個其他一些就像寫一個擴展方法什麼的。

+1

你可以顯示代碼..?空字符串不應該正常拋出異常,除非你正在做一些奇怪類型的轉換..你看過IsNullOrEmpty ..嗎? – MethodMan

+2

讓我明白。你想System.Convert.ToInt32(「」)返回0?在不更改名爲的方法名稱? – Steve

+0

@DJKRAZE'Convert.ToInt32(「」)'會拋出一個FormatException,但是'Convert.ToInt32(null)'將返回0.不要問我爲什麼:) – 2012-08-22 21:40:02

回答

0

由於ChaosPandion的回答(基於他的代碼),我想出如何使一個快速檢查和轉換。它還有助於減少代碼更改,只從中刪除Convert.

下面是INT的方法:

public static Int32 StringToInt32(string str) 
{ 
    if (string.IsNullOrEmpty(str)) 
     return 0; 
    else 
     return Convert.ToInt32(str); 
} 
+0

所有'Convert.ToInt32'確實是檢查'str'是否爲空,返回'0',否則調用'Int32.Parse(str)',所以這個檢查已經在你的方法可以直接調用'Int32.Parse(str)'。 – MCattle

0
String x = ""; 
    int val =0; 

    if(x != String.Empty){ 

     if(Integer.TryParse(x)){ 
     val = Convert.ToInt32(x) 
     }else{ 
     ///Exception 
     } 
    } 

    Use val variable here 
2

這不能做而不改變(或與此觀察到的投擲FormatException的行爲的其他轉換方法)傳遞到Convert.ToInt32的值。

如果只是是造成問題,則三元條件操作者可以很方便的空字符串:

int num = !string.IsNullOrEmpty(input) 
    ? Convert.ToInt32(input) 
    : 0; 

Convert.ToInt32(null)實際上將評估爲0就好了,但它僅僅是爲有效處理這種情況下,我們自己..)

當然,這仍然將打破像"foo"和諸如此類的東西輸入值..

+0

錯字在您的IsNullOrEmpty – MethodMan

+0

如果字符串不可解析?例如input =「Something」 –

+0

@DJKRAZE修正:-) – 2012-08-22 21:44:57

3

我會做這樣的事情:

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作爲包裝。這應該是相當安全的。

2

我能想到的最好的事情是

int number = System.Convert.ToInt32("".EmptyToNumber()); 

其中EmptyToNumber是字符串

public static string EmptyToNumber(this string input) 
{ 
    return (string.IsNullOrEmpty(input) ? "0" : input); 
} 

這種擴展方法,但是,將需要在搜索大家Convert.ToInt32的您的代碼並將擴展名EmptyToNumber添加到作爲參數傳遞的現有字符串中。

1

我認爲這裏適當的行動是應用一種不同的技術,而不是期待框架爲你改變。嘗試使用下面的代碼來創建字符串實例的擴展方法。

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; 
    } 
} 
0

如果你熟悉正則表達式,你可以不喜歡以下

public static bool IsNumeric(string text) 
{ 
    return string.IsNullOrEmpty(text) ? false : 
      Regex.IsMatch(text, @"^\s*\-?\d+(\.\d+)?\s*$"); 
} 
-1

你說當字符串爲空拋出一個異常?所以趕上例外。

int myvar = 0; 
try { 
    myvar = myParseMethod(input); // call your parse method here 
} 
catch (MyEmptyStringException ex) { 
    // Keep going 
} 
+0

我不會推薦這個。總是要求一個try-catch的重語法是不可讀的。 – ChaosPandion

+0

@ChaosPandion同意,我不想在任何地方使用它,只是纏繞主分析例程。 –

+0

這不完全是主題。 – user1306322