2009-11-13 50 views
12

如果無法將字符串解析爲int,有沒有返回null的方法?int.TryParse =如果不是數字,則爲null?

有:

public .... , string? categoryID) 
{ 
int.TryParse(categoryID, out categoryID); 

得到「無法從 '串出' 轉換爲 'OUT INT'

做什麼

編輯:

不再是相關的,因爲asp.net約束是解決問題的方法

/M

+2

當你想將它存儲到字符串中時,爲什麼要將它解析爲int? – 2009-11-13 14:17:08

+2

順便說一下,字符串是一個引用類型,所以你不應該使它爲空。 (這是否編譯?) – 2009-11-13 14:17:51

+0

我用這個asp.net mvc所以categoryID從url映射,所以我得到錯誤,如果我在url中傳遞字符串 – 2009-11-13 14:20:43

回答

24

首先,爲什麼你想爲一個字符串解析爲int,並堅持將結果返回到一個字符串?

方法簽名是

bool int.TryParse(string, out int) 

所以你必須得到作爲第二個參數int類型的變量。這也意味着如果解析失敗,則不會得到null,而是該方法將簡單地返回false。但你可以很容易地把它們拼在一起:

int? TryParse2(string s) { 
    int i; 
    if (!int.TryParse(s, out i)) { 
     return null; 
    } else { 
     return i; 
    } 
} 
+0

呃,謝謝,加里。編寫代碼而不編譯它會引發如下錯誤:-) – Joey 2009-11-13 14:24:19

+1

我敢打賭,這將是一個很好的擴展方法 – cost 2014-01-20 06:50:44

0

**這個答案被低估了很多** 雖然這是一個可能的解決方案 - 它是一個糟糕的性能明智的,並且可能不是一個好的編程選擇。

我不會刪除它,因爲我想很多程序員可能不知道這一點,所以這裏是一個例子,如何不要做的事情:

使用嘗試,趕上

try 
{ 
res = Int32.Parse(strVAR) 
} 
catch(exception ex) 
{ 
return null; 
} 
+1

更好使用'TryParse'。 – jason 2009-11-13 14:18:38

+0

那麼,這仍然是一個選項.... – Dani 2009-11-13 14:20:02

+1

自從C#2.0問世以來,TryParse幾乎總是比異常捕獲更好。 – Bomlin 2009-11-13 14:20:59

0

int是一個值類型,這意味着沒有這樣的東西作爲null int。所以不,TryParse將永遠不會改變out參數,因此它是空的。

但是,你遇到的問題是,當你期待一個整數時,你將一個字符串傳遞給TryParse的out參數。

你需要像這樣...

Int categoryID = 0; 
string strCategoryID = "somestringmaybeitsaninteger"; 

int.TryParse(strCategoryID, out categoryID); 
+0

有一個可爲空的int:int? – Dani 2009-11-13 14:17:26

+0

Dani:'TryParse'但是返回'int',而不是'Nullable '。 – Joey 2009-11-13 14:20:06

+0

int?實際上並不是一個整數類型...它是System.Nullable 的簡寫。 – jerhinesmith 2009-11-13 14:21:01

0

TryParse將返回false,如果字符串不能被解析。你可以使用這個事實來返回解析值,或者返回null。無論如何,我猜你正打算從你的方法返回int?,那麼這將是這樣的:

public int? ParseInt(string categoryID) 
{ 
    int theIntValue; 
    bool parseOk = int.TryParse(categoryID, out theIntValue); 
    if(parseOk) { 
     return theIntValue; 
    } else { 
     return null; 
    } 
} 
14

下面是正確使用的Int32.TryParse

int? value; 
int dummy; 
if(Int32.TryParse(categoryID, out dummy)) { 
    value = dummy; 
} 
else { 
    value = null; 
} 
return value; 
+4

或者:value = int.TryParse(categoryID,out dummy)? dummy:null; – 2009-11-13 14:55:25

+1

是的,絕對如此,但對新手來說這更不透明。 – jason 2009-11-13 15:04:34

+0

@Dan:不會編譯;-)但是,我更喜歡這個解決方案(加上一個強制轉換,以便編譯它)。 – 2009-11-13 17:44:12

0

你想這樣做這個?

public int? Parse(string categoryID) 
{ 
    int value; 
    if (int.TryParse(categoryID, out value)) 
    { 
    return value; 
    } 
    else 
    { 
    return null; 
    } 
} 
9

這個怎麼樣?

public int? ParseToNull(string categoryId) 
{ 
    int id; 
    return int.TryParse(categoryId, out id) ? (int?)id : null; 
} 
+0

此解決方案可能會從轉換爲擴展方法中受益。 – 2009-11-13 14:28:08

+0

它已經是我的應用程序中的擴展方法,但我不知道摩爾根想要什麼,所以我把它作爲一種方法。 – DigitalNomad 2009-11-13 14:39:09

+0

你不需要在那裏使用id。一個int或一個null是一個有效的可空對象:)。 – Khanzor 2010-12-23 03:12:09

2

最簡單的...

Int N = Int.TryParse(somestring, N) ? N : 0; 

它的工作原理「因爲它是從左向右計算的。沒有那麼容易。

相關問題