Double.parse失败

时间:2018-10-16 08:37:36

标签: java

尝试操作时出现错误:

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€”-> 235和75,这是我无法解析的。我确实替换->

该Java的

“ 2035.75”承认了该数字。但是我得到了错误->

 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  : *******************

5 个答案:

答案 0 :(得分:3)

replaceAll接受一个正则表达式,而.是匹配任何内容的正则表达式字符,因此some.replaceAll(".", "")替换了所有内容。您需要先使用.

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

或简单地使用replace代替f,它不接受正则表达式,而是常规的CharSequencechar

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

请注意,如果您使用的是IDE,则可能会在正则表达式部分突出显示一个字眼,我建议使用以下一个:

enter image description here

答案 1 :(得分:3)

您应该考虑使用本地化解决问题。请参阅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"),但请确保根据需要进行调整

答案 2 :(得分:1)

更改此行

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

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

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

答案 3 :(得分:1)

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

因此在正则表达式.中具有任何单个字符的含义,因此在您编写代码时some = some.replaceAll(".", "")

会将每个字符替换为空值

尝试:some = some.replaceAll("\\.", "")

答案 4 :(得分:-1)

我认为您不需要执行replaceAll。下面的代码应该可以工作

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