Double.Parse、Double.TryParse、IsNumeric 使用注意事項

筆者今天根據[VB.NET]IsNumeric()’s bug?!這篇網友的回應嘗試使用IsNumeric(“不是一個數字”)下去測試,回傳的值會是True,執行結果不怎麼如我所預期,且將字串改成”不是兩個數字”、”是一個數字”…卻還都是False。研究後才發現到Double.Parse、Double.TryParse、IsNumeric這三個用爛了的方法,使用上還是有些小細節需要特別注意。

這邊筆者寫了一個簡單的範例來示範一下:

Imports System.Linq.Expressions

Module Module1

Sub Main()
Dim values = New String() {“不是一個數字”, “正無窮大”, “負無窮大”}
For Each value In values
Dim convertedValue = 0.0

Dim result = Double.TryParse(value, convertedValue)

Console.WriteLine(“value: {0}”, value)
Console.WriteLine(“Double.TryParse(value, convertedValue): {0} ({1})”, result, convertedValue)
Console.WriteLine(“Double.Parse(value): {0}”, Double.Parse(value))
Console.WriteLine(“IsNumeric(value): {0}”, IsNumeric(value))

Console.WriteLine(New String(“=”, 78))
Next
End Sub

End Module


運行結果會像下面這樣,可以看到”不是一個數字”、”正無窮大”、”負無窮大”…這些跟系統訊息比較相關的字串會被成功地轉換。

image

用監看式去看會更為清楚,分別會被替換為-1.#IND、1.#INF、-1.#INF。

image

若有興趣研究為甚麼會有這樣的現象,可進一步去查看.NET底層Number.ParseDouble的實作。

image