【问题标题】:atof() in Java? No exception throwingJava中的atof()?不抛出异常
【发布时间】:2013-11-12 15:23:10
【问题描述】:

我想解析 '5.3984.234' 格式的字符串并将其转换为浮点数。显然浮点数将是 5.3984

在 C 中,使用 atof() 会得到这个结果,但在 Java 中,Float.parseFloat() 和 Float.valueOf() 都会抛出异常。

我不希望函数抛出异常,并且想要与 atof() 相同的功能我该怎么做?

注意:我不能保证字符串中总是有两个句点。有时可能是 48328.458,有时可能是 4823.5482.4822 甚至是 42894.4383.8349.439

【问题讨论】:

标签: java


【解决方案1】:

嗯,首先也是最重要的 atof() 可以返回未定义的行为,所以我不想完全模仿;)请参阅:

atof() with non-nullterminated string

我的意思是。

无论如何,为了解决您使用 Java 的问题,我会使用 String.substring 方法来处理它,您只需将字符串解析到第二个 '.',然后使用它执行您想要的任何功能.尽管如此,如果您不在乎在第二个“。”之后扔掉所有东西。它变得容易多了。

这里有一些代码可以使我提到的工作:

public class main{
public static void main(String[] args)
{
    String test = "5.3984";
    int tempIndex = 0;

    tempIndex = test.indexOf('.');
    tempIndex =  test.indexOf('.', tempIndex + 1 );
    if (tempIndex != -1)
    {
        System.out.println("multiple periods: " + Float.parseFloat(test.substring(0, tempIndex)));
    }
    else 
    {
        System.out.println("Only one Period: :" + Float.parseFloat(test));
    }
}

现在,这可能不是超级健壮,但它似乎工作正常。

【讨论】:

  • 谢谢。这不能处理没有小数点的字符串(我知道,不是在我原来的问题中......),但我修改了它并且效果很好。
  • 没问题!我没有检查每一个边境案例,只检查大的。但我很高兴你能够修改它来做你需要的,祝你好运!
【解决方案2】:

一种选择是使用StringTokenizer,使用.作为分隔符,然后只使用前两个标记进行转换。

【讨论】:

  • 唯一的问题是,String Tokenizer 会根据令牌分解数字,所以不是得到 '59234.2342' 你会得到 ['59234'], [2342] which you' d 然后必须重新组合成双。可能会很痛苦。
  • 使用分词器后,还有字符串,还没有进行转换。因此,将它们组合起来就像token1 + "." + token2 一样简单。从那里您可以安全地前往parseFloat()
【解决方案3】:

Double.parseDouble() 总是处理整个字符串。由于您必须在其中包含小数点,因此它将引发 NumberFormatException。我也不相信你的结果是明显。输入要么格式错误,要么依赖于语言环境(您也可以预期值为 53984234)。

【讨论】:

    【解决方案4】:

    您需要将正确的前导浮点表示与其后面的附加数据分开。这就是我会做的:

    Pattern p = Pattern.compile("^(-?\\d+(\\.\\d+)?)");
    Matcher m = p.matcher(stringWithFloatInIt);
    if (m.find()) {
        f = Float.parseFloat(m.group(0));
    } else {
        // String was not even CLOSE to a number
    }
    

    【讨论】:

      【解决方案5】:

      在 Java 中你可以这样做:

      //this only works if the string has exactly two points (two '.' characters)
      //(sorry, I misread the question)
      //String string = "1.2341.234";
      //float f = Float.parseFloat(string.substring(0, string.lastIndexOf(".")));
      
      
      
          //for any number of points in the string:  
          String string = "1.2.3";
          String[] elems = string.split("\\.");
          float f = Float.parseFloat(elems.length==1 ? string : elems[0]+"."+elems[1]);
      

      【讨论】:

      • 如果字符串有三个点,它将抛出 NumberFormatException。需要额外的预处理。
      猜你喜欢
      • 2012-07-23
      • 2016-08-10
      • 2013-03-14
      • 2012-01-24
      • 2011-02-07
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多