2014-04-16 88 views
2
下面

是代碼:爪哇雙輸入驗證

Scanner scan = new Scanner(System.in); 
    String input = scan.next(); 
    try{ 
     double isNum = Double.parseDouble(input); 
     if(isNum == Math.floor(isNum)) { 
      System.out.println("Input is Integer"); 
      //enter a double again 
     }else { 
      System.out.println("Input is Double"); 
      //break 
     } 
    } catch(Exception e) { 
     if(input.toCharArray().length == 1) { 
      System.out.println("Input is Character"); 
      //enter a double again 
     }else { 
      System.out.println("Input is String"); 
      //enter a double again 
     } 
    } 

從這裏採取:how to check the data type validity of user's input (Java Scanner class)

然而,當我輸入1.0或0.0,但仍然被認爲是一個整數,爲1.0不被認爲是雙?

請幫幫忙,謝謝!

+2

我建議掃描輸入爲一個字符串,並試圖解析它爲一個int,如果它是成功的,它是一個int。如果沒有,然後嘗試解析它作爲一個浮動 – maxx777

+0

解析之前,你可以檢查它是否有字符點(。)來決定它的雙倍或整數 –

+0

@ maxx777輸入是一個字符串解析到一個雙... – user3540710

回答

0

如果你要正確對待1.0作爲Double1作爲Integer,你需要與input變量,它是String類型的工作。

Java將始終以同樣的方式對待Double x = 1Double y = 1.0(意爲1是有效Double),所以你將無法將其與代碼區分。

既然你有輸入的原始字符串表示,使用正則表達式或其他驗證來檢查它。例如,對於雙樣品正則表達式模式看起來像"[0-9]+(\.){0,1}[0-9]*"和用於整數"[0-9]+""\d+"

下面是一個例子:

final static String DOUBLE_PATTERN = "[0-9]+(\.){0,1}[0-9]*"; 
final static String INTEGER_PATTERN = "\d+"; 

Scanner scan = new Scanner(System.in); 
String input = scan.next(); 

if (Pattern.matches(INTEGER_PATTERN, input)) { 
    System.out.println("Input is Integer"); 
    //enter a double again 
} else if (Pattern.matches(DOUBLE_PATTERN, input)) { 
    System.out.println("Input is Double"); 
    //break 
} else { 
    System.out.println("Input is not a number"); 
    if (input.length == 1) { 
     System.out.println("Input is a Character"); 
     //enter a double again 
    } else { 
     System.out.println("Input is a String"); 
     //enter a double again 
    } 
} 
+1

我會試試這個,thx – user3540710

0

檢查,如果你正在驗證的字符串包含一個點 - 那麼,如果parseDouble成功,它可以被視爲一個雙值(即使是1.0)。

0

您是否1.0等於1,這在數學上是正確的。因此,您的第一個if將返回true,並且將被視爲int。看起來程序的整個想法是檢查雙打,看他們是否有小數。

2

1.0通常被認爲是一個有效的雙精度值,但是該代碼已被明確寫入,以威脅整數作爲無效雙精度(打印它們是整數)。要改變這種行爲,如果去掉內:

try{ 
    double isNum = Double.parseDouble(input); 
    System.out.println("Input is Double"); 
} catch(Exception e) { 
    if(input.toCharArray().length == 1) { 
     System.out.println("Input is Character"); 
    }else { 
     System.out.println("Input is String"); 
    } 
} 
+0

讓我看看如果它拋出一個錯誤,我認爲它會接受整數作爲有效,因爲字符串1可以解析爲1.0? – user3540710

+0

'1'也是一個有效的雙。我希望上面的代碼能夠成功進行類似的輸入。 –

+0

如果1是一個有效的雙倍,那麼我的問題得到解答。謝謝。 – user3540710

0
Math.floor(x) 

返回一個翻番,從1.0確實是一樣的1.0,你的程序將進入第一個if塊。

0

我認爲你的測試存在缺陷。你說0.01.0被解析爲整數」根據條件

isNum == Math.floor(isNum) 

雙精度浮點數不是位的隨機垃圾:他們表達了精確的數量和它發生的數字一個,能精確表示(see the bit patterns),因此它們等於Math.floor(val)(順便說一句,這種情況發生了很多整數值,不僅零和一)

所以,你應該重新考慮你的T est 之前您的代碼。考慮到用戶可能永遠不會輸入整數double:她輸入的數字是十進制數,您應該根據輸入的用途來處理輸入(該選項位於String,BigDecimal,數字,整數,雙等...)