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)。
当我 运行 这行代码时: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)。