【问题标题】:Fail in Double.parse [duplicate]Double.parse 失败 [重复]
【发布时间】:2018-10-16 08:37:35
【问题描述】:

我尝试做时出错:

private Double isEmpty(String some) {

    LOGGER.info("Se ha llamado a isEmpty, valor: " + some);
    Double empty = null;

    try {
        if (some != null) {
            // Reemplazar porque nosotros usamos los . para los miles
            if(some.contains(".")) {
                some = some.replaceAll(".", "");
            }
            if(some.contains(",")) {
                some = some.replaceAll(",", ".");
            }
            empty = Double.parseDouble(some);
            LOGGER.info("Nuevo valor en isEmpty en Double: " + some);
        }
    } catch (Exception ex) {
        LOGGER.error("*******************");
        LOGGER.error("************ Falló la ejecución isEmpty *************");
        LOGGER.error(ex.getMessage() + ex);
        LOGGER.error(ex.getLocalizedMessage());
        LOGGER.error("*******************");
    }

    return empty;
}

在我的国家“1.000”是一千,在美国是一... 然后我将所有字符替换为英文格式...

例如在我的国家:“2.035,75€” --> 两千三十五和七十五……我无法解析这个。我确实替换->

“2035.75”对于那个 Java 承认这个数字。但我得到错误->

 Se ha llamado a isEmpty, valor: 19.425
2018-10-16 ERROR 6197 --- [nio-8090-exec-5] Imp  : *******************
2018-10-16 ERROR 6197 --- [nio-8090-exec-5] Imp  : ************ Falló la ejecución isEmpty *************
2018-10-16 ERROR 6197 --- [nio-8090-exec-5] Imp  : empty Stringjava.lang.NumberFormatException: empty String
2018-10-16  ERROR 6197 --- [nio-8090-exec-5] Imp  : empty String
2018-10-16  ERROR 6197 --- [nio-8090-exec-5] Imp  : *******************

【问题讨论】:

    标签: java


    【解决方案1】:

    replaceAll 采用正则表达式,. 是匹配任何内容的正则表达式字符,因此some.replaceAll(".", "") 将所有内容替换为空。你需要退出 .:

    some = some.replaceAll("\\.", "");
    

    或者干脆使用replace代替f,它不接受正则表达式,而是常规的CharSequencechar

    some = some.replace(".", "");
    

    请注意,如果您使用 IDE,您可能会在 regex 部分获得突出显示,我建议您使用一个:

    【讨论】:

    • ... 或者只使用replace
    • @khelwood 但可能会有不止一个匹配项被替换。
    • 是的,这就是替换的作用。 “用指定的文字替换序列替换此字符串中与文字目标序列匹配的每个子字符串。”它只是不使用正则表达式,因此您不必转义任何内容。
    • @khelwood 你是对的,我只是在 js 中编程并且感到困惑,用普通字符串替换只替换一次......
    • @khelwood 如果您的字符串中有多个小数点分隔符,无论如何您都应该失败 - “123.45.67”的预期值是多少?
    【解决方案2】:

    您应该考虑使用本地化来解决您的问题。请看Converting different countrys currency to double using java

    您可以尝试以下方法:

    public BigDecimal parseMoney(String some) {
        try {
            Locale yourLocale = new Locale("es", "ES");
            return parse(some, yourLocale);
        } catch (ParseException pe) {
            return null;
        }
    }
    
    public BigDecimal parse(String amount, Locale locale) throws ParseException {
        final NumberFormat format = NumberFormat.getNumberInstance(locale);
        if (format instanceof DecimalFormat) {
            ((DecimalFormat) format).setParseBigDecimal(true);
        }
        return (BigDecimal) format.parse(amount);
    }
    

    请注意

    • 你的方法isEmpty 不符合它的名字,所以我把它改成了parseMoney
    • 在处理金钱时你不应该依赖Double所以我将返回类型更改为BigDecimal
    • 我假设您位于讲西班牙语的国家/地区,因此我选择了 Locale("es", "ES"),但请务必根据需要进行调整

    【讨论】:

    • 除了编程错误之外,这是正确的答案。但是请在这个答案中包含更多内容,现在它更像是评论,因为基本上只链接。 OP 将如何更改他的代码以执行您的建议?
    • 感谢您的提示。我添加了更多细节。
    【解决方案3】:

    改变这一行

    some = some.replaceAll(".", "");
    

    some = s.replaceAll("\\.", "");
    

    因为.(点)表示与所有匹配。

    【讨论】:

      【解决方案4】:

      replaceAll 需要两个参数:第一个是正则表达式,第二个是要替换的子字符串。

      所以在正则表达式中. 具有任何单个字符的含义,因此在您编码时,您的每个字符都被替换为空值:some = some.replaceAll(".", "")

      试试这个:some = some.replaceAll("\\.", "")

      【讨论】:

        【解决方案5】:

        我认为您不需要替换全部。下面的代码应该可以工作

                String some = "19.27";
                double d = Double.parseDouble(some);
                System.out.println("String " + some + " is parse to double value : " + d);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-10
          • 2015-07-10
          • 2021-01-09
          • 2020-05-13
          • 2020-08-08
          • 2015-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多