iT邦幫忙

0

微軟的Bug,會把中文字串判斷為數字,尋求解答

這是在藍色小舖有人提出的問題,看誰能解的出來XD

這個.net程式在輸出的時候為true,而不是false

Response.Write(IsNumeric("不是一個數字"))

除了這組字串外~其他都是false

Response.Write(IsNumeric("不是二個數字"))



Response.Write(IsNumeric("不是一個數字吧"))



Response.Write(IsNumeric("一個數"))



Response.Write(IsNumeric("一"))

這是傳說中微軟window系統不穩的原因嗎.......疑惑

看更多先前的討論...收起先前的討論...
CalvinKuo iT邦大師 7 級 ‧ 2013-07-19 14:12:35 檢舉
為什麼是NaN??
他只是把isNumeric判斷改成別的判斷方式~

答案依然沒解出來~

Dim Num As Double
Response.Write(Double.TryParse("不是一個數字", Num))
Response.Write(Double.TryParse("不是一個數字吧", Num))
剛剛那個文更新了~

有答案出來了~微軟會把中文語意化~用中文當做計算式來處理。

引用小羊的話
---
4樓講出了問題點...

我們的微軟...在數字判斷時...
額外做了3種檢查...

1. 負無限大的檢查
2. 正無限大的檢查
3. 不是一個數字的檢查
(註:以上3種, 都是做 "文字" 的比對)
更重要的是, 這3者的文字, 依國情不同, 會有不同結果...

(這個要靠 .Net Reflector 來看裡面的運作, 才會發現...)
NumberFormatInfo這個class,
在new(...)的時候, 最底下有1個 Culture 的檢查...
也就是說, 在正體中文的平台,

會自動把英文替換成中文...

negativeInfinitySymbol 設定為【正無窮大】(注意:是無窮大,不是無限大)
positiveInfinitySymbol 設定為【負無窮大】
nanSymbol 設定為【不是一個整數】


=======================================
我剛才實測的結果:
asp.net的頁面,加上 UICulture="en" Culture="en-US"
<%@ Page UICulture="en" Culture="en-US" .... >
然後再去測試。。。

Response.Write(IsNumeric("不是一個數字")) '在en的語系,這是false
Response.Write(IsNumeric("NaN")) '在en的語系,這是true



也就是說,這是3種文字,是特例資料...
它是numeric, 但它並不是可以被拿來使用的數字

同時,它也隨著平台的不同,而使用不同的文字來做判斷...
jer5173提到:
negativeInfinitySymbol 設定為【正無窮大】(注意:是無窮大,不是無限大)
positiveInfinitySymbol 設定為【負無窮大】


小提醒一下:
negativeInfinity->負無窮大
positiveInfinity->正無窮大
你剛好寫相反了

另外, 據我的認知, infinity指的就是無限大, 意同無窮大.
您有特別註明此2者不相等, 可否進一步說明?
另外分享一下我在MS SQL isnumeric遇到的例外.
大家可以試試'7D02'這個字串
select ISNUMERIC('7D02')

答案很妙, 也是回傳1(true)
N'7D02'也是一樣的結果
a802216 iT邦新手 4 級 ‧ 2013-07-22 14:25:24 檢舉
select ASCII('7D02')
你就會知道為什麼了
a802216提到:
select ASCII('7D02')
你就會知道為什麼了


感謝回覆, 原來如此.
ISNUMERIC不能好好把它當成一個字串處理嗎? 一定要這麼聰明的自己轉換, 唉.

1 個回答

6
丁丁 (Dean)
iT邦大師 6 級 ‧ 2013-07-22 18:00:44
最佳解答

中文字串判斷為數字

http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20130719085414PMM.html
經過高手們的探討...
問題在微軟進行數字判斷時,會另額外做了3種檢查

  1. 負無限大的檢查
  2. 正無限大的檢查
  3. 不是一個數字的檢查
    (註:以上3種, 都是做 "文字" 的比對)
    更重要的是, 這3者的文字, 依國情不同, 會有不同結果...
    在new(...)的時候, 最底下有1個 Culture 的檢查...
    也就是說, 在正體中文的平台,
    會自動把英文替換成中文...

至於這是不是個 Bug, 就見仁見智了 @@
話說我以前有遇過某個 .Net Component 裡面沒寫好~
找到個印度ㄚ三的解法來 Override 它... XD

我要發表回答

立即登入回答