Формат строки двойной до максимального количества символов в java

#java #format #double

Вопрос:

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

Ну, на самом деле до точного количества символов, но я могу завернуть его в a String.format("%Xs", ...) с заданным X, чтобы заполнить отсутствующий символ.

Обратите внимание, что в SO и Интернете есть много вопросов, связанных с этим, но я не смог найти точно такой же, как у меня, для java.

О чем я думаю, так это о том, чтобы написать

  • полный двойной, если он подходит: для максимального символа n=10 123,4567-это хорошо
  • округлите десятичную дробь и сохраните целочисленную часть, если она подходит: для n=10 123456.789654 будет отформатирован в 123456.79
  • используйте экспоненциальный в противном случае: для n=10 123456789123.321654 будет отформатирован в 1.23457e11

=> Есть ли практический инструмент для этого или что-то эквивалентное?

Ответ №1:

Это то, что у меня есть на данный момент, не идеально, но я уже трачу на это достаточно времени.

Идея в том, что Double.toString я делаю именно то, что хочу, но для фиксированной длины (может быть, кто-то знает, как настроить эту длину?). Поэтому я использую его и удаляю десятичную дробь, когда это необходимо

 /** write a double to a string of exact given length (but for some extreme cases) */
public static String doubleToString(double x, int length) {
    String str = Double.toString(x);
    if(str.length() <= length){
        return org.apache.commons.lang.StringUtils.repeat(" ", length - str.length())   str;

    } else if(str.contains("E")){
        String[] split = str.split("E");
        String num = split[0];
        String exp = split[1];
        return removeDecimal(num, length - exp.length()-1)   'E'   exp;
    } else {
        return removeDecimal(str, length);
    }
}

// remove trailing decimal of a double as string such as xxx.yyyy
private static String removeDecimal(String doubleStr, int length){
    int dotIndex = doubleStr.indexOf('.');
    return doubleStr.substring(0, Math.max(dotIndex 1, length));
}
 

Ответ №2:

Взгляните на BigDecimal (https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html) Я использую новый десятичный формат(«0,00»), если хочу, чтобы всегда отображались два знака после запятой, например, 1000,5 будет отображаться как 1000,50.

Комментарии:

1. Это не удовлетворяет ни одному из требований ОП.

2. Я видел десятичный формат, но мог бы достичь своей цели с его помощью (но, может быть, я пропустил некоторые функции?)