Java Parsefloat 异常,字符串是数字后跟字符

Java Parsefloat Exception with a string that is number followed by characters

当我 运行 这行代码时:Float.parseFloat("1460000 JPY") 我收到错误

线程中出现异常 "main" java.lang.NumberFormatException:对于输入字符串:“1460000 JPY”

此字符串来自表单的 API 调用,其中这是一个未经验证的文本字段。它通常有效,因为人们只输入一个数字,但有时你会遇到这个问题。如何将其设为 return 仅将初始数字作为浮点数并忽略尾随字母字符?

更新: 解决@Tom 提出的错误:

Float.parseFloat("1.46 JPY".replaceAll("[^0-9.]",""));

1.46

以上是更好的解决方案。请参阅下面的解释。

正如@azurefrog 所说,剥离非数字字符然后将剩下的内容解析为 Float 是 go.You 的方法,可以使用以下代码完成此操作:

Float.parseFloat("1460000 JPY".replaceAll("[^0-9]",""));

1460000.0

虽然这不是很稳健,因为对于像 "1.46" 这样的输入,输出变成

146.0

.replaceAll("[^0-9.]","") 通过将小数点 . 字符添加到排除正则表达式中来修复此错误,例如 [^0-9.]

您可以使用正则表达式来查找该字符串是否仅包含数字

String apistring = "1460000 JPY";
if(apistring.matches("[0-9]+")){
// do your code
}else{
// throw some  error message
}

从中剥离字符会很困难,因为你说它是一个输入字段,用户可以输入任何文本。只有当你知道有一个特定的模式时,你才能把它去掉

由于 DecimalFormat 对解析字符串非常宽松,我建议这样做。

你可以这样使用它:

DecimalFormat df = new DecimalFormat();
try {
    float parsedValue = df.parse("1460000 JPY").floatValue();
    System.out.println(parsedValue);
} catch (ParseException pe) {
    pe.printStackTrace();
    // handle exception a bit more
}

这会打印:

1460000.0

如您所见,如果传递的字符串以数字以外的其他内容开头,则 parse 方法可以抛出 ParseException,例如:

blub 1460000 JPY

如果您的应用不会发生这种情况,那么您不必为此烦恼。

您可以使用正则表达式提取输入中的数字。

s = s.replaceAll("[^0-9]","");

然后从中解析浮点数。唯一的缺点是它会提取所有数字(它会从 1245 JPY 3 中提取 1245 和 3)。