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

Java Parsefloat异常,字符串后跟数字和字符,java,numberformatexception,parsefloat,Java,Numberformatexception,Parsefloat,当我运行这行代码:Float.parseFloat(“146000JPY”)时,我得到了错误 线程“main”java.lang.NumberFormatException中的异常:对于输入字符串:“146000JPY” 此字符串来自一个表单的API调用,该表单是一个没有验证的文本字段。它通常是有效的,因为人们只输入一个数字,但有时你会遇到这个问题。如何让它只返回初始数字作为浮点数,而忽略后面的字母字符?更新:解释@Tom带来的错误: Float.parseFloat("1.46 JPY".re

当我运行这行代码:Float.parseFloat(“146000JPY”)时,我得到了错误

线程“main”java.lang.NumberFormatException中的异常:对于输入字符串:“146000JPY”


此字符串来自一个表单的API调用,该表单是一个没有验证的文本字段。它通常是有效的,因为人们只输入一个数字,但有时你会遇到这个问题。如何让它只返回初始数字作为浮点数,而忽略后面的字母字符?

更新:解释@Tom带来的错误:

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

以上是一个优越的解决方案。请参见下面的解释

正如@azurefrog所说,去掉非数字字符,然后解析剩下的
Float
是一种方法。您可以使用以下代码来实现这一点:

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

但这不是很可靠,因为对于像
“1.46”
这样的输入,输出变得

146.0


.replaceAll(“[^0-9.]”,“)
通过向排除正则表达式添加十进制
字符来修复此错误,如so
[^0-9.]

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

String apistring = "1460000 JPY";
if(apistring.matches("[0-9]+")){
// do your code
}else{
// throw some  error message
}
从中剥离字符将很困难,因为您说这是一个输入字段,用户可以输入任何文本。只有当您知道有一种特定的模式时,才可以去掉它,因为我建议您在解析字符串时非常宽松

您可以这样使用它:

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

如您所见,如果传递的字符串不是以数字开头,则该方法可以抛出
ParseException
,如:

蓝色1460000日元


如果这不会发生在你的应用程序中,那么你就不必为此烦恼。

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

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

然后从中解析float。唯一的缺点是,它将提取所有数字(它将从1245日元3中提取1245和3)。

您需要先去掉字母,然后解析剩下的浮点数。使用
float.parseFloat(“1460000日元”.replaceAll([^0-9],”)也处理前面的字符。它对包含十进制分隔符的值做了一些不好的事情,那么“否”如何呢?:)去掉小数点分隔符不是很聪明。对不起,我不确定我是否理解你的意思。你是说
Float.parseFloat(“1460000.0.replaceAll”([^0-9])
将导致
1460000.0
?我将避免使用
作为固定值,因为分隔符在不同的语言环境中是不同的。除了语言环境问题之外,如果试图解析字符串(如“1.2.3”),您将再次失败—您将需要更复杂的正则表达式以确保最多有一个小数点(这就是暂时搁置区域设置问题。)