Отрицательный знак в случае нуля в java
Есть ли способ обрезать отрицательный знак, когда результат возвращает ноль; используя десятичный формат?
DecimalFormat df = new DecimalFormat("#,##0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
formattedValue = df.format("-0.023");
Вышеприведенный код возвращает -0.0. Есть ли способ, по которому он вернет только 0.0? Тем не менее, я хочу сохранить отрицательный знак, когда результат является отрицательным числом.
Ответы
Ответ 1
Я не думаю, что есть способ сделать это только с DecimalFormat
, но этот однострочник решает проблему:
formattedValue = formattedValue.replaceAll( "^-(?=0(\\.0*)?$)", "");
Он удаляет (заменяет на ""
) знак минус, если за ним следуют 0-n символов "0.00000..."
, поэтому это будет работать для любого аналогичного результата, такого как "-0"
, "-0."
или "-0.000000000"
Вот некоторый тестовый код:
public static void main(String[] args) {
System.out.println(format(-0.023));
System.out.println(format(12.123));
System.out.println(format(-12.345));
System.out.println(format(-0.123));
System.out.println(format(-1.777));
}
public static String format(double number) {
DecimalFormat df = new DecimalFormat("#,##0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
String formattedValue = df.format(number);
formattedValue = formattedValue.replaceAll("^-(?=0(\\.0*)?$)", "");
return formattedValue;
}
Выход (как и ожидалось):
0.0
12.1
-12.3
-0.1
-1.8
Ответ 2
Я думаю, что это было бы обходным путем, чтобы избежать -0.0
. Используйте следующий код:
DecimalFormat df = new DecimalFormat("#,##0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
df.setNegativePrefix(""); // set negative prefix BLANK
String formattedValue = df.format(-0.023);
df.setNegativePrefix("-"); // set back to - again
System.out.println(formattedValue);
Выход:
0.0
Ответ 3
Попробуйте следующее: DecimalFormat df = new DecimalFormat("#,##0.0#;(#,##0.0#)");
В соответствии с Javadoc для DecimalFormat:
Паттерн DecimalFormat содержит положительный и отрицательный подшаблон, например, "#, ## 0.00; (#, ## 0.00)". Каждый подшаблон имеет префикс, числовая часть и суффикс. Отрицательный подшаблон является необязательным; если отсутствует, то положительный подшаблон с префиксом локализованного минуса знак ('-' в большинстве локалей) используется как отрицательный подшаблон. Что "0,00" только эквивалентно "0,00; -0,00". Если есть явный отрицательный подшаблон, он служит только для указания отрицательного префикс и суффикс; количество цифр, минимальные цифры и другие характеристики все те же, что и положительный. Это значит что "#, ## 0.0 #; (#)" производит точно такое же поведение, как. "#, ## # 0,0; (#, ## # 0,0)"
Ответ 4
Чтобы проверить, вычисленное value = "-0.0"
сделайте его равным "0.0"
и вы можете запрограммировать sushus как
public String getFormattedValue(String input) {
DecimalFormat df = new DecimalFormat("#,##0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
String formattedValue = df.format(input);
if (formattedValue.equalsIgnoreCase("-0.0")) {
formattedValue = "0.0";
}
System.out.println(formattedValue);
return formattedValue;
}
Ответ 5
Я считаю, что -0
весьма полезен, потому что он сообщает вам, что округленное значение было фактически отрицательным (что может иметь большой смысл для некоторых функций). Единственная проблема для меня в том, что -1 * 0
на самом деле действительно 0 и должен быть отформатирован как 0
, хотя это не с Java formatters.
Следующий форматтер позаботится об этом, без дорогостоящей стоимости манипуляции с String (особенно RegExps):
public static String formatWithoutMinusZeroIssue(double d, DecimalFormat yourFormatter) {
if (d == 0) {
return yourFormatter.format(0);
} else {
return yourFormatter.format(d);
}
}
Это использует тот факт, что хотя -1 * 0
и 0
отформатированы по-разному, они равны.
Ответ 6
Котлинская версия богемного ответа:
fun Double.formatAmount(): String {
val ds = DecimalFormatSymbols()
ds.decimalSeparator = '.'
ds.groupingSeparator = ','
val df = DecimalFormat("#,##0.##", ds)
df.roundingMode = RoundingMode.DOWN
var formattedDouble = df.format(this)
formattedDouble = formattedDouble.replace("^-(?=0(\\\\.0*)?\$)".toRegex(), "")
return formattedDouble
}