Подтвердить что ты не робот

Отрицательный знак в случае нуля в java

Есть ли способ обрезать отрицательный знак, когда результат возвращает ноль; используя десятичный формат?

DecimalFormat df = new DecimalFormat("#,##0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
formattedValue = df.format("-0.023");

Вышеприведенный код возвращает -0.0. Есть ли способ, по которому он вернет только 0.0? Тем не менее, я хочу сохранить отрицательный знак, когда результат является отрицательным числом.

4b9b3361

Ответ 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
}