26

当结果返回零时,有什么方法可以截断负号;在使用十进制格式时?

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

上面的代码返回 -0.0 。有什么方法可以只返回 0.0?但是,当结果为负数时,我想保留负号。

4

7 回答 7

25

我不认为有一种方法可以做到这一点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
于 2012-08-13T07:12:07.227 回答
5

我认为这将是一种避免的解决方法-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
于 2012-08-13T06:43:50.263 回答
2

试试这个:DecimalFormat df = new DecimalFormat("#,##0.0#;(#,##0.0#)");

根据DecimalFormat 的Javadoc

DecimalFormat 模式包含正负子模式,例如“#,##0.00;(#,##0.00)”。每个子模式都有一个前缀、数字部分和后缀。否定子模式是可选的;如果不存在,则以局部减号(在大多数语言环境中为“-”)为前缀的正子模式用作负子模式。也就是说,单独的“0.00”等同于“0.00;-0.00”。如果有明确的否定子模式,它仅用于指定否定前缀和后缀;位数,最小位数和其他特征都与正模式相同。这意味着 "#,##0.0#;(#)" 产生与 "#,##0.0#;(#,##0.0#)" 完全相同的行为。

于 2012-08-13T06:31:46.510 回答
1

通过检查计算值是否=“-0.0”使其等于“0.0”

您可以将代码 sush 封装为

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;
    }
于 2012-08-13T06:36:09.773 回答
1

我发现它-0非常有用,因为它告诉您四舍五入的值实际上是负数(这对某些函数可能有很多意义)。对我来说唯一的问题是它-1 * 0实际上是 0 并且应该被格式化,0尽管它不是 Java 格式化程序。

以下格式化程序负责处理此问题,而无需昂贵的字符串操作成本(尤其是 RegExps):

public static String formatWithoutMinusZeroIssue(double d, DecimalFormat yourFormatter) {
    if (d == 0) {
        return yourFormatter.format(0);
    } else {
        return yourFormatter.format(d);
    }
}

这使用了这样一个事实,即尽管-1 * 00的格式不同,但它们是相等的。

于 2017-03-27T12:32:04.190 回答
1

更快并且可以任意精度工作(还支持忽略例如货币的后缀,将 0 用于无后缀):

public static String normalizeNegativeZero(final String str, final int skipSuffixLength) {
    if (str.length() > 3 && str.charAt(0) == '-' && str.charAt(1) == '0'
            && (str.charAt(2) == '.' || str.charAt(2) == ',')) {
        for (int i = 3; i < str.length() - skipSuffixLength; i++) {
            if (str.charAt(i) != '0') {
                return str;
            }
        }
        return StringUtils.removeStart(str, "-");
    } else {
        return str;
    }
}

这里的测试用例:

Assertions.assertThat(normalizeNegativeZero("-0.00000", 0)).isEqualTo("0.00000");
Assertions.assertThat(ScaledDecimalToStringBuilder.normalizeNegativeZero("-0.00001", 0)).isEqualTo("-0.00001");

Assertions.assertThat(normalizeNegativeZero("-0.00000EUR", "EUR".length())).isEqualTo("0.00000EUR");
Assertions.assertThat(normalizeNegativeZero("-0.00001EUR", "EUR".length())).isEqualTo("-0.00001EUR");
于 2020-01-17T13:44:06.760 回答
-1

Bohemian 的Kotlin 版本的回答

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
}
于 2019-07-01T14:22:43.883 回答