2009-02-06 50 views
1

我需要維護一個傳統的VB.NET Web應用程序。數據分類是,我會說,不一致。尤其是,有些數據有時以整數存儲,有時作爲字符串存儲,我必須可靠地將字符串解析爲整數。如果解析出錯,它應該總是返回0.解析字符串爲整數(來地獄或高水)

問題是,我不能使用任何.NET/VB.NET解析函數,但我必須依靠自制函數。

我可以使用單行標準框架調用來執行每個字符串到整數解析任務嗎?

比方說,有一個字符串可以爲空,空,包含整數表示,如「10」或包含其他內容。

我嘗試了這些與空輸入字符串 「」

CType(string, Integer) -> Conversion from string "" to type 'Integer' is not valid. 
Convert.ToInt32(string) -> Input string was not in a correct format. 
Integer.Parse(string) -> Input string was not in a correct format. 
CInt(string) -> Conversion from string "" to type 'Integer' is not valid. 
Val(string) -> Success! 

但即使瓦爾可能會失敗。肯定的方法是調用自制功能:

Public Function ToInteger(ByVal s As String) As Integer 

     s = Trim(s) 
     Dim i As Integer 

     Try 
      i = Val(s) 
     Catch ex As Exception 
      i = 0 
     End Try 

     Return i 

    End Function 

我覺得這很糟糕。這是不好的,因爲:

  • 我想解析字符串爲整數!即使涉及語義學,這也不是火箭科學。
  • 自制標準不能很好地保持。在代碼的某處,您總是會發現破碎的標準框架解決方案

因此,軟件中存在不必要的錯誤。我指責這個標準框架。除非找到更好的解決方案:)


感謝您的所有答案。 Int32.TryParse在這裏非常完美。

但是,如果您必須先將輸入強制轉換爲字符串,則強制轉換可能會失敗。就像從具有可能的DBNull值的數據庫對象讀取一樣。

回答

13

使用Int32.TryParse並忽略返回值 - 僅使用out參數中的值。

+0

Int32.TryParse在這裏是完美的,謝謝 -mika- – mika 2009-02-06 11:16:01

+0

其實@Jon Int32.TryParse自動修剪白色空間。 ``32「`將導致`32`。 – David 2016-08-30 19:38:50

7

你沒有解釋,爲什麼你不能使用「.NET/VB.Net解析功能,」所以我會提出這樣的: -

Public Function ToInteger(ByVal s As String) As Integer 
    Dim i as Integer 
    Integer.TryParse(s, i) 
    Return i 
End Function 
1

這是一種雙線性還不夠好?下面是C#代碼,但我敢肯定,您可以將其移植到VB.NET沒有太多的問題:

int i; 
if(!Int32.TryParse(MyString, out i)) i=0; 

事實上,因爲TryParse將設置我來,如果解析失敗爲零,你不需要if語句:

int i; 
Int32.TryParse(MyString, out i); 
0

如果你正在做大量的字符串解析和不確定可能是什麼,你可以嘗試使用regular expressions的的字符串中。無論你在尋找什麼,兩三個精心挑選的正則表達式都應該拋棄掉。

regexbuddy這樣的工具在這種情況下是無價的。它將允許您在GUI環境中爲您的字符串設計正則表達式,您可以在各種替代方法上測試它們。

例如,以下內容將匹配字符串中的任意位置的數字,並匹配用空格分隔的多個數字。

(\d*) 

正則表達式有時被認爲有點可怕,但他們並不需要。