我想解析格式为'5.3984.234'的字符串并将其转换为浮点数。显然浮动将是5.3984
在C中,使用atof()会得到这个结果,但在Java中,Float.parseFloat()和Float.valueOf()都会抛出异常。
我不希望该函数抛出异常并且想要相同的atof()函数我该怎么做?
注意:我不能保证字符串中总有两个句点。有时它可能是48328.458,其他时间4823.5482.4822甚至42894.4383.8349.439
答案 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
}