Рефакторинг этого ужасного кода, который проверяет, сколько десятичных чисел имеет двойной - PullRequest
0 голосов
/ 07 января 2020

У меня есть некоторый код, который проверяет, сколько десятичных знаков имеет мое число.

Пример:

1,10 правильное преобразование: String.format("%.1f", Double.parseDouble(md.get("amount"))

1,10 неверное преобразование: String.format("%.2f", Double.parseDouble(md.get("amount"))

У меня не может быть трейлинг 0 's

1 правильное преобразование: String.format("%.0f", Double.parseDouble(md.get("amount"))

1 неправильное преобразование: String.format("%.1f", Double.parseDouble(md.get("amount"))

У меня не может быть трейлинг 0 *

Для чисел больше 1 000 000 Java преобразует мои числа в научную нотацию c, и единственный известный мне способ преобразовать их обратно без потери десятичных дробей - это использовать String.format.

Мой плохой код:

md - это карта, и ключ «сумма» отображается в строку, которая должна быть двойной

if( Double.parseDouble(md.get("amount")) * 10 % 10 != 0) {
  System.out.println("0,1");
  md.put("amount", String.format("%.1f", Double.parseDouble(md.get("amount"))));
  if( Double.parseDouble(md.get("amount")) * 100 % 10 != 0) {
    System.out.println("0,11");
    md.put("amount", String.format("%.2f", Double.parseDouble(md.get("amount"))));
  }
}
else if(Double.parseDouble(md.get("amount")) * 10 % 10 == 0 && Double.parseDouble(md.get("amount")) * 100 % 10 == 0){
  System.out.println("0,0");
  md.put("amount", String.format("%.0f", Double.parseDouble(md.get("amount"))));
}

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Чтобы узнать, сколько у вас десятичных знаков, вы можете использовать scale () из BigDecimal. Поскольку ваш номер является строкой, вы должны преобразовать в BigDecimal.

Map<String, String> map = new HashMap<>();
map.put("amount", "1000000.23321312");

System.out.println(new BigDecimal(map.get("amount")).scale());

Отображаемое значение: 8

0 голосов
/ 07 января 2020

Вы пробовали регулярное выражение?

        double[] v = { 221, 22.1, 22.11 };
        Locale.setDefault(Locale.GERMANY);

        for (double val : v) {
            String str = String.format("%.2f", val);
            str = str.replaceAll("(.*?)0*$", "$1").replaceAll("(.*?)\\,$", "$1");

            System.out.println(str);
        }

  1. Первый replaceAll удаляет завершающие 0 *
  2. Второй replaceAll удаляет конечную десятичную точку.
0 голосов
/ 07 января 2020
String s = md.get("amount").replaceFirst("(\\.(\\d*[1-9])?)0+$", "$1");

Двойник - это всего лишь приближение, 0,1 не будет точным: 0,09999987 или около того.

Обычно для обозначения non-scientifi c используется BigDecimal с toPlainString.

...