簡體   English   中英

Java雙輸入驗證

[英]Java double Input Validation

以下是代碼:

    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
        }
    }

取自這里: 如何檢查用戶輸入的數據類型有效性(Java Scanner類)

但是,當我輸入1.0或0.0時,它仍然被視為一個整數,1.0不被視為雙倍?

請幫幫我們,謝謝!

1.0通常被認為是一個有效的雙精度,但代碼已被明確寫入威脅整數作為無效的雙精度(打印它們是整數)。 要更改此行為,請刪除內部if:

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");
    }
}

如果要將1.0視為Double 1作為Integer ,則需要使用input變量( String類型)。

Java將始終以Double y = 1.0 (意味着1是有效的Double )的方式處理Double x = 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
    }
}

檢查,如果您要驗證的字符串包含一個點 - 那么,如果parseDouble成功,則可以將其視為double值(即使對於1.0)。

檢查1.0是否等於1,數學上是正確的。 因此,您的第一個if將返回true,它將被視為int。 似乎程序的整個想法是檢查雙打,看看它們是否有小數。

Math.floor(x)

返回一個double,由於1.0確實與1.0相同,程序將進入第一個if塊。

我認為你的測試是有缺陷的。 根據條件,您說0.01.0被解析為整數”

isNum == Math.floor(isNum)

雙精度浮點數不是隨機的比特垃圾:它們表示精確的數量,並且恰好可以精確表示數字01 (參見位模式) ,因此它們等於Math.floor(val) (順便說一句,這發生在很多整數值上,而不僅僅是零和一個)

因此,您應該代碼之前重新考慮您的測試。 考慮到用戶可能永遠不會輸入整數雙精度 :她輸入的是十進制數 ,你應該根據它的用途來處理輸入(選擇是在String,BigDecimal,Number,Integer,Double和等...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM