#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. Я видел десятичный формат, но мог бы достичь своей цели с его помощью (но, может быть, я пропустил некоторые функции?)