【问题标题】:Java Parsefloat Exception with a string that is number followed by characters带有数字后跟字符的字符串的 Java Parsefloat 异常
【发布时间】:2015-07-13 16:54:10
【问题描述】:

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

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

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

【问题讨论】:

  • 你需要先去掉字母,然后将剩下的解析成一个浮点数。

标签: java numberformatexception parsefloat


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    由于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 日元

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

    【讨论】:

    • 使用Float.parseFloat("1460000 JPY".replaceAll("[^0-9]","")); 也可以处理前面的字符。
    • 它对包含小数点分隔符的值做了一些坏事,那么“否”呢? :)
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      更新:解释@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.]","") 通过将小数 . 字符添加到排除正则表达式来修复此不准确之处,例如 [^0-9.]

      【讨论】:

      • 去掉小数点分隔符并不是很聪明。
      • 很抱歉,我不确定我是否理解您的意思。你是说Float.parseFloat("1460000.0".replaceAll("[^0-9]","")); 会导致14600000.0
      • 我会避免使用. 作为固定值,因为不同区域的分隔符不同。
      • 除了语言环境问题之外,如果您尝试解析诸如“1.2.3”之类的字符串,您将再次失败 - 您需要一个更复杂的正则表达式来确保最多有一位小数点(这暂时搁置了语言环境问题。)
      猜你喜欢
      • 2018-01-13
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多