2009-11-03 51 views
12

是否有更好的方法來測試字符串是否可以轉換爲除以下類似的整數?測試在VB.NET中是否可以將字符串轉換爲整數

Public Function IsInt(ByVal value As Object) As Boolean 
    Try 
     Dim temp As Integer = CInt(value) 
     Return True 
    Catch ex As Exception 
     Return False 
    End Try 
End Function 

「更好」我的意思是沒有詳細和/或沒有例外。

的TryParse將要走的路,但我使用緊湊的框架2.0的TryParse似乎並沒有得到執行....

感謝反正。

看來MarkJ是正確的,上面看起來功能上與IsNumeric相同,所以我想這就是我的答案。我不知道爲什麼我認爲CInt比IsNumeric更嚴格。我想最好使用CInt詩句來測試IsNumeric,因爲這是我用來完成轉換的功能。

+3

+1,以避免在正常的控制流異常。 – Heinzi 2009-11-03 16:20:04

+1

什麼,這裏沒有建議使用正則表達式?我感到震驚! (http://stackoverflow.com/questions/223832/check-a-string-to-see-if-all-characters-are-hexadecimal-values) – 2009-11-03 16:27:33

+0

@Michael Burr:根據您的要求,我添加了一條建議使用正則表達式。由於TryParse不被支持,我認爲在這種情況下,regex是你的下一個最佳選擇。 – 2009-11-03 21:22:32

回答

13

您可以使用內置的IsNumeric功能

Dim CanConvert as Boolean = IsNumeric(value) 

http://msdn.microsoft.com/en-us/library/6cd3f6w1(VS.71).aspx

+1

IsNumeric允許$和。這可能會導致鑄造失敗。 – 2009-11-03 16:21:53

+0

在這種情況下,TryParse是要走的路線 – 2009-11-03 16:24:51

+1

+1 @Booji Boy,你說的不對。 IsNumeric允許'.'和'$',但CInt(它將小數值向下舍入)也是如此。我已經檢查過桌面框架 - Compact框架是否做了一些不同的事情? – MarkJ 2009-11-04 11:54:56

3

好,如果你想避免使用異常,你可以將它與正則表達式相匹配,該正則表達式在轉換之前只允許數字字符。

+2

但我會遇到兩個問題! ;-) – 2009-11-03 16:33:59

4
Public Function IsInt(ByVal value As Object) As Boolean 
    Dim i As Integer 
    Return Integer.TryParse(Convert.ToString(value), i) 
End Function 
1
Dim s as String = "23" 
Dim i as Integer 
If Int32.TryParse(s, i) Then 
    ' String was a valid integer... ' 
End If 
5

可以使用Integer.TryParse,它會返回一個布爾值,指示轉換是否是全成與否

1

使用TryParse整數類型的共享方法。

例如:

Private Function CanStringBeCastAsInteger(ByVal myString As String) As Boolean 
    Dim myInt As Integer = 0 
    Return Integer.TryParse(myString, myInt) 
End Function 

使用的TryParse方法的好處是,它避免了當轉換失敗拋出並隨後捕捉異常。投擲和捕捉異常是一項昂貴的操作。

TryParse方法不僅會返回True/False結果,告訴您轉換是否成功,它還將在我的示例的myInt參數中爲您返回所產生的轉換,全部在一行中的代碼。

0

你需要推出自己的正則表達式e.x .: Regex.IsMatch(「4354354」,「\ d +」),並且仍然包含try/catch塊作爲備份。

+0

-1,對不起,有幾個原因。Try/Catch作爲應用程序的錯誤處理邏輯的一部分是很好的,但不是簡單地作爲正則表達式邏輯錯過的備份。這個正則表達式不是那麼難以確定它的正確性。也必須downvote,因爲在你的例子中的正則表達式是不夠的。 「A123Z」會通過,「-10」會失敗。 – 2009-11-03 21:18:40

2

如果您只是不經常執行轉換,那麼您所擁有的就沒有問題(假設您沒有TryParse()可用) - 它不會影響性能。

如果您要執行數百萬次轉換,並且其中大量轉換可能會失敗,那麼您遇到的異常可能是性能問題(可能)。

如果你不能使用TryParse()可能最好的事情(perf-wise)是簡單地檢查字符串中的每個字符,如果它不是數字返回false。不要忘記考慮一個可能的負號和組分隔符(如果你想支持它們)。

否則,將字符串解析爲一個int,這將在99%的情況下成功。如果不適合,你只會得到一個異常。如果你真的想避免Parse()可能產生的異常,實際上你自己解析數字的刺痛並不難,並且如果超出範圍則返回失敗。

喬恩斯基特做的框架在此之前回來,迅速分析包含TryParse()

這一切都不固定冗長,雖然。但只要它是一個獨立的方法,一點冗長就沒有真正的問題。

1

這是非常類似的東西對你有什麼既可使用Convert類,而不是CTYPE和不使用的TryParse

Public Function IsInt(ByVal value As Object) As Boolean 
    Try 
     Convert.ToInt32(value) 
     Return True 
    Catch ex As System.FormatException 
     Return False 
    End Try 
End Function 
+0

爲什麼要使用'Convert'類?它沒有優勢。事實上,'Convert'類是非常多餘的(除非你需要在10以外的基數中表示一個數字,並且只有'ToString'支持的基數是16)。 – 2009-11-04 16:21:39

6

由於在Compact Framework中的TryParse isn't supported,正則表達式是你的下一個最好的選擇。

第一個示例不允許使用小數。第二個是。

Regex.IsMatch(value, "^-?\d+$") 
Regex.IsMatch(value, "^-?\d+(?:\.\d+)?$") 

如果你需要允許科學記數法,你需要多一點的調整它。它真的不是那麼糟糕。您已獲得字符串^,可選短劃線-?,一個或多個數字\d+,非捕獲組(?:)的開頭,其查找單個小數點\.和一個或多個數字\d+。另一個?允許零個或一個非捕獲組的實例,然後結束字符串$

編輯: 有一件事我沒有想到前:這個方法有點不準確的,因爲你可以得到一個非常巨大的數字,數字一個有效的整數,但不能轉換爲Int32。如果這是可能的話,你可以限制字符的數量。例如,您可以使用\d{1,8}而不是\d+

+0

+1另一個精簡框架陷阱 – 2009-11-03 21:26:55

+2

該方法也沒有區域意識 - 有些文化使用逗號','爲小數定界符而不是點'。' – MarkJ 2009-11-04 11:58:09

+0

@MarkJ,好點。 – 2009-11-04 13:35:31

-1

不要如下

If myString <> "" And IsNumeric(myString) = True Then 

     If CDbl(myString) - Int(CDbl(myString)) > 0 Then 
      .... myString is integer 
     End If 

    End If