Java中的atof()?没有例外投掷

时间:2013-11-12 15:23:10

标签: java

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

嗯,首先,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 :(得分:1)

Double.parseDouble()始终处理整个String。由于你必须有小数点,它将抛出一个NumberFormatException。我也不相信你的明显的结果。输入格式错误或依赖于区域设置(您还可以期望值为53984234)。

答案 3 :(得分:0)

在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]);

答案 4 :(得分:0)

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

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
}