验证没有try-catch的整数或字符串

时间:2010-03-21 02:47:05

标签: java validation

好的,我迷路了。我需要弄清楚如何验证整数,但由于一些愚蠢的原因,我不能使用Try-Catch方法。我知道这是最简单的方法,所以互联网上的所有解决方案都在使用它。

我用Java写作。

这笔交易是这样的,我需要有人输入数字ID和字符串名称。如果两个输入中的任何一个无效,我必须告诉他们他们犯了错误。

有人能帮助我吗?

7 个答案:

答案 0 :(得分:5)

如果我理解正确,您正在从标准输入中读取整数或字符串作为字符串,并且您要验证整数实际上是整数。也许您遇到的麻烦是Integer.parseInt()可用于将String转换为整数抛出NumberFormatException。听起来你的任务禁止使用异常处理(我是否理解正确),因此你不允许使用这个内置函数并且必须自己实现它。

确定。所以,由于这是作业,我不打算给你完整的答案,但这里是伪代码:

let result = 0 // accumulator for our result
let radix = 10 // base 10 number
let isneg = false // not negative as far as we are aware

strip leading/trailing whitespace for the input string

if the input begins with '+':
    remove the '+'
otherwise, if the input begins with '-':
    remove the '-'
    set isneg to true

for each character in the input string:
    if the character is not a digit:
        indicate failure
    otherwise:
        multiply result by the radix
        add the character, converted to a digit, to the result

if isneg:
     negate the result

report the result

这里的关键是每个数字的基数时间比直接数字右边的数字更重要,因此如果我们总是乘以基数从左到右扫描字符串,那么每个数字都有其正确的意义。现在,如果我弄错了,你实际上可以使用try-catch但是根本没有想出如何:

int result = 0;
boolean done = false;
while (!done){
     String str = // read the input
     try{
         result = Integer.parseInt(str);
         done = true;
     }catch(NumberFormatException the_input_string_isnt_an_integer){
         // ask the user to try again
     }
}  

答案 1 :(得分:3)

不确定正在验证的String是否应该检查内容是否只包含数字,还是实际可以在int的有效范围内表示,解决此问题的一种方法是迭代String的字符并检查字符是否仅由数字组成。

由于这似乎是家庭作业,这里有一点伪代码:

define isANumber(String input):
  for (character in input):
    if (character is not a number):
      return false

  return true

答案 2 :(得分:2)

我正在使用Java 1.6,这对我有用:

if (yourStringVariable.trim().matches("^\\d*$"))

然后你有一个正整数

答案 3 :(得分:1)

您可以使用java.util.ScannerhasNextInt()来验证String是否可以转换为int而不会抛出异常。

作为一项额外功能,它可以跳过空格,并容忍额外的垃圾(您可以检查)。

String[] ss = {
   "1000000000000000000",
   "  -300  ",
   "3.14159",
   "a dozen",
   "99 bottles of beer",
};
for (String s : ss) {
   System.out.println(new Scanner(s).hasNextInt());
} // prints false, true, false, false, true

另请参阅:How do I keep a scanner from throwing exceptions when the wrong type is entered?

答案 4 :(得分:0)

查看Scanner中的hasNext方法。请注意,每种类型都有方法(例如hasNextBigDecimal),而不仅仅是hasNext。

编辑:不,只有在扫描仪过早关闭的情况下,才会抛出无效输入。

答案 5 :(得分:0)

Pattern p = Pattern.compile("\\d{1,}");
Matcher m = p.matcher(inputStr); 
boolean isNumber = false;

if (m.find()) {
    isNumber = true;   
}

答案 6 :(得分:0)

public static boolean IsNumeric(String s)
{
    if (s == null)
        return false;
    if (s.length() == 0)
        return false;
    for (int i = 0; i < s.length(); i++)
    {
        if (!Character.isDigit(s.charAt(i)))
            return false;
    }
    return true;
}