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

  • 15325
  • 0
  • C#
  • 2013-07-26

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

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

 

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



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