2014-04-16 18 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,数字,整数,双等...)