台灣最大程式設計社群網站
線上人數
1389
 
會員總數:246690
討論主題:190103
歡迎您免費加入會員
討論區列表 >> ASP.NET >> Response.Write(IsNumeric("不是一個數字")) 居然輸出 True ??
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Response.Write(IsNumeric("不是一個數字")) 居然輸出 True ??
價值 : 100 QP  點閱數:4670 回應數:10
樓主

MIS2000 Lab
中級顧問
28726 36
15120 4765
發送站內信

一位朋友問我的,但我回答不出來
希望各位前輩給我一些意見,謝謝

Response.Write(IsNumeric("不是一個數字"))
居然輸出 True

本篇文章發表於2013-07-19 08:54
== 簽名檔 ==
無垢清淨光 慧日破諸闇 能伏災風火 普明照世間

ASP.NET專題實務 教學網站與範例
https://www.dotblogs.com.tw/mis2000lab/
ASP.NET 專題實務(博碩出版),共有上下兩集。

線上教學均提供 第一堂課 免費試聽
ASP.NET MVC5與 .NET Core線上教學影片 
 https://www.dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
ASP.NET Web Form 線上教學影片 
 https://www.dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
1樓
作者回應

MIS2000 Lab
檢舉此回應
這是VB的 IsNumeric函式,微軟網站也有幾個範例
http://msdn.microsoft.com/zh-tw/library/6cd3f6w1(v=vs.80).aspx

另外,相關的測試如下

Response.Write(IsNumeric("不是個數字"))
輸出 False

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

實在不能理解啊
.........................................................................................................


Response.Write(IsNumeric("123")) 輸出 True

Response.Write(IsNumeric("1X3")) 輸出 False

本篇文章回覆於2013-07-19 08:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

Allen
捐贈 VP 給 Allen 檢舉此回應
我猜可能是特例吧

IsNumeric()內部是叫用double.TryParse(), 從上圖可以看到TryParse遇到這個中文字串是傳回true, 而值是NaN(not a number)

其他的字串就全傳回false了
本篇文章回覆於2013-07-19 12:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

Sdany
捐贈 VP 給 Sdany 檢舉此回應
MS 暗藏已久的功能,被測出來了


(我也覺得是特例)


本篇文章回覆於2013-07-19 12:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不錯的參考

Koshimoto
檢舉此回應
我測試的結果是它會把數字運算會產生的結果都判斷為數字
例如:"正無窮大"、"負無窮大"、"不是一個數字"....
正數除以0 = "正無窮大"
負數除以0 = "負無窮大"
"不是一個數字"的結果我不記得要怎麼用出來了
但我以前有試出來過
本篇文章回覆於2013-07-19 12:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
不錯的參考

KKBruce
捐贈 VP 給 KKBruce 檢舉此回應
結合 2f 與 4f

我看了一下 Double.TryParse 在解析時是會帶「文化」特性,

Double.NaN 在中文翻譯剛好是 "不是一個數字"

可能演算法有點問題,造成了 4F 所說的:把「運算結果」的「中文」回傳為 True。

官方說明中:
如果 Expression 為可以成功轉換成數字的 Char 或 String,它也會傳回 True。

所以我想是反著看:

"不是一個數字" 等於 Double.NoN, NoN 在 VB 裡是用 -1 代表,-1 是個數字,所以回傳 True。

其他"正無窮大""負無窮大" 也是一樣等於 Double.NegativeInfinity / Double.PositiveInfinity 在 VB 裡都是用 -1。

以上是我的推論。
本篇文章回覆於2013-07-19 13:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
不錯的參考

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
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, 但它並不是可以被拿來使用的數字

同時,它也隨著平台的不同,而使用不同的文字來做判斷...
本篇文章回覆於2013-07-19 14:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

MIS2000 Lab
檢舉此回應
各位前輩實在太神了,
功力高深、不可限量

謝謝各位這麼寶貴的建議,十分受用。
我會請讀者來看這篇文章(因為我也不會回答,只能請網路上的高人出手幫助)
本篇文章回覆於2013-07-19 14:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

08alan
檢舉此回應
竟然內建了翻譯的功能 ...
強大
本篇文章回覆於2013-07-19 16:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

MIS2000 Lab
檢舉此回應
補充一下,另一位網友的文章

Double.Parse、Double.TryParse、IsNumeric 使用注意事項
http://www.dotblogs.com.tw/larrynung/archive/2013/07/19/111546.aspx
本篇文章回覆於2013-07-19 18:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回9樓,那鍋“英英”就是我...
謝謝各樓的大大,想不到這個奇怪的問題牽扯範圍這麼廣...

【負無限大】我在昨天也遇到了,我暫時用IF把這些吊詭的字濾掉。

惱人的鬼打牆問題就這麼豁然開朗,再次謝謝各位大大的協助。
本篇文章回覆於2013-07-19 20:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.