Java中用于负值的Atoi

Java中用于负值的Atoi,java,for-loop,negative-number,atoi,for-else,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.char

我正在用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;

    }
}   
class-Atoi{
int atoi(字符串tmp){
int结果=0;
对于(int i=0;i
但不幸的是,它给了我一个与角色相反的等价物,即-12,它给了我655312!救命啊


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

对明显问题的快速修复:逻辑顺序错误

而不是

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

但还有两个问题:

  • 如果存在“-”字符,则它不会否定该值
  • 如果这是输入字符串:-1-2-3-4-5怎么办?结果会很有趣编辑:也可以尝试输入:“répa”。。。更有趣的结果

不要忘了用不正确的输入进行测试,正如@Klaus所建议的,不要犹豫,抛出一个异常(最好)和一条正确的错误消息,如果函数的输入不正确…

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

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

您应该给出一个错误,而不是
continue
(抛出异常,
return-1
或您所说的“giveaneror”是什么意思)

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

result = digit + result * 10;

你的代码假设没有-

(char)(tmp.charAt(i) - '0');
是一种盲目地将“数字”变量钳制为数字的优化


你需要逐步了解你的代码实际上在做什么,搜索一个ASCII图表,并研究“0”的减法运算('0'==48),所以“1”(49)-'0'(48)=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;
}
intatoi(字符串tmp){
int结果=0;
整数系数=tmp.字符(0)=“-”?-1:1;
对于(int i=0;i'9')
继续;
字符位=(字符)(tmp.charAt(i)-'0');
结果+=(数字*数学功率(10,(tmp.length()-i-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”之类的字符串引发异常


更一般地说,如果库方法不能完全满足您的要求,那么在修改其行为的方法中使用它通常很容易,而不是重新编写它。

这不起作用。因为
数字
永远不会是
-
。仔细看看代码。是的,这就行了。但一定要引用,它应该在if-else块之前。事实上,如果在那之后不需要else,+1比在每次迭代中使用Math.pow更优雅(更快)。虽然这种想法需要习惯。。。但真正的问题是,他也确实想处理消极的numebrs!假设我需要检查浮点数,我应该怎么做?如果我输入12.1或123.2,它应该分别返回12.1和123.2!!第一个案件已经解决。。我使用了一个初始化为0的变量“负”。如果出现-,则将其递增1。。因此,如果负==1,则数字前面会出现一个-符号。。第二个问题仍然在努力解决!将在11分钟内接受您的回复!;)提示:我认为只有第一个字符可以是“-”,可以使用此信息…假设我需要检查浮点数,我应该怎么做?如果我输入12.1或123.2,它应该分别返回12.1和123.2!!您应该检查“.”字符,在遇到该字符后,将分数添加到结果中。
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;
}
  static int atoi(String tmp)
  {
      int result = Integer.parseInt(tmp);
      if(result >= 0) {
         return result;
      } else {
         throw new IllegalArgumentException("Negative string "+"\"" + tmp + "\"");
      }
  }
      return Math.abs(result);