Atoi在Java中为负值

时间:2012-11-06 13:33:00

标签: java for-loop negative-number atoi for-else

我正在用Java编写Atoi函数。它运行正常+ ve整数。但我想要的是当我输入一个负整数时它应该给我一个错误。所以我尝试在我的班级Atoi中加入continue语句。实施的课程是:

class Atoi {

    int atoi(String tmp) {

    int result = 0;

        for (int i = 0; i < tmp.length(); i++) {

            char digit = (char)(tmp.charAt(i) - '0');

        if(digit == '-')

        continue;
        }

        else {

            result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

    return result;

    }
}   

但不幸的是,它给了我这个字符的负面等价物,即-12它给了我655312!帮助

编辑:假设我需要检查浮点数,我该怎么办?如果我输入12.1或123.2,则应分别返回12.1和123.2!

6 个答案:

答案 0 :(得分:2)

而不是continue你应该给出错误(抛出异常,return -1或任何你的意思“给出一个错误”)。

如果要忽略-,可以将else子句更改为:

result = digit + result * 10;

答案 1 :(得分:1)

快速解决明显问题:逻辑顺序错误......

而不是

    char digit = (char)(tmp.charAt(i) - '0');
    if(digit=='-')
    continue;

    char origChar=tmp.charAt(i);
    if(origChar=='-')
        continue;
    char digit = (char)(origChar - '0');

但还有两个问题:

  • 如果出现' - '字符,它不会否定该值!
  • 如果这是输入字符串怎么办:-1-2-3-4-5?结果会很有趣! 编辑:也尝试此输入:'répa'...更有趣的结果!

不要忘记使用不正确的输入进行测试,正如@Klaus建议的那样,如果输入的输入不正确,请不要犹豫,抛出异常(最好是IllegalArgumentException)并输入正确的错误消息功能......

答案 2 :(得分:1)

当然,您可以编写这样的代码,但是您需要检查 tmp 是否为有效数字。

int atoi(String tmp) {

    int result = 0;

    int factor = tmp.charAt(0) == "-" ? -1 : 1;

        for (int i = 0; i < tmp.length(); i++) {

            if (tmp.chatAt(i) < '0' ||  tmp.chatAt(i) > '9') 

                continue;

                char digit = (char)(tmp.charAt(i) - '0');

                result += (digit * Math.pow(10, (tmp.length() - i - 1)));
        }

        return result * factor;
}

答案 3 :(得分:1)

如果没有将其作为编程练习,那么有一个更简单的解决方案:

  static int atoi(String tmp)
  {
      int result = Integer.parseInt(tmp);
      if(result >= 0) {
         return result;
      } else {
         throw new IllegalArgumentException("Negative string "+"\"" + tmp + "\"");
      }
  }

在否定结果案例中替换相应的例外或其他操作。如果你想忽略' - ',就像在发布的代码中那样,将if-then-else替换为:

      return Math.abs(result);

此代码还会为“abc”等字符串抛出异常。

更一般地说,如果库方法没有完全符合您的要求,通常很容易在修改其行为的方法中使用它,而不是重写它。

答案 4 :(得分:0)

如果您不想转换负数,那么只要您遇到-符号而不是进一步循环,只需返回0。将此代码放在if-else块之前。

     if(tmp.charAt(i)=='-')  
         return 0;

答案 5 :(得分:0)

if(digit=='-')

使用

(char)(tmp.charAt(i)

你的代码是假设没有 -

(char)(tmp.charAt(i) - '0');

是一种盲目地将'digit'变量钳制到数字的优化。

您需要逐步完成代码实际执行的操作,搜索ASCII图表并查看“0”的减法('0'== 48),以便'1'(49) - '0 '(48)= 1等...