我想解析格式为“5.3984.234”的字符串并将其转换为浮点数。显然浮点数将是 5.3984
在 C 中,使用 atof() 会给出这个结果,但在 Java 中,Float.parseFloat() 和 Float.valueOf() 都抛出异常。
我不希望函数抛出异常并希望与 atof() 具有相同的功能我该怎么做?
注意:我不能保证字符串中总是有两个句点。有时可能是 48328.458,有时是 4823.5482.4822 甚至是 42894.4383.8349.439
我想解析格式为“5.3984.234”的字符串并将其转换为浮点数。显然浮点数将是 5.3984
在 C 中,使用 atof() 会给出这个结果,但在 Java 中,Float.parseFloat() 和 Float.valueOf() 都抛出异常。
我不希望函数抛出异常并希望与 atof() 具有相同的功能我该怎么做?
注意:我不能保证字符串中总是有两个句点。有时可能是 48328.458,有时是 4823.5482.4822 甚至是 42894.4383.8349.439
一种选择是使用 StringTokenizer,.
用作分隔符,然后仅使用前两个标记进行转换。
好吧,首先 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));
}
}
现在,这可能不是超级健壮,但它似乎工作正常。
Double.parseDouble()
总是处理整个字符串。由于您必须在其中包含小数点,因此它将引发 NumberFormatException。我也不相信你的结果是显而易见的。输入要么格式错误,要么依赖于语言环境(您也可以期望值为 53984234)。
在 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]);
您需要将正确的前导浮点表示与其后面的附加数据分开。这就是我要做的:
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
}