0

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

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

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

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

4

5 回答 5

2

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

于 2013-11-12T15:26:08.770 回答
2

好吧,首先 atof() 可以返回未定义的行为,所以我不想完全模仿;)看:

atof() 具有非空终止字符串

对于我的意思。

无论如何,为了解决您使用 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));
    }
}

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

于 2013-11-12T15:28:56.937 回答
1

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

于 2013-11-12T15:29:50.753 回答
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]);
于 2013-11-12T15:28:36.920 回答
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
}
于 2013-11-12T15:35:26.663 回答