在java中为零的负号

时间:2012-08-13 06:22:57

标签: java

当结果返回零时,有没有办法截断负号;使用十进制格式时?

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

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

7 个答案:

答案 0 :(得分:21)

我认为只有DecimalFormat才能实现这一目标,但是这个单线程可以解决问题:

formattedValue = formattedValue.replaceAll( "^-(?=0(\\.0*)?$)", "");

如果后面跟着""的0-n个字符,它会删除(替换为"0.00000...")减号,因此这适用于任何类似的结果,例如"-0",{{ 1}}或"-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;
}

答案 1 :(得分:3)

我认为这是一种避免-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

答案 2 :(得分:2)

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

根据Javadoc for DecimalFormat

  

DecimalFormat模式包含正负子模式,   例如,“#,## 0.00;(#,## 0.00)”。每个子模式都有一个前缀,   数字部分和后缀。负子模式是可选的;如果   缺席,然后正面子模式以局部减号为前缀   sign(大多数语言环境中的“ - ”)用作负子模式。那   是,“0.00”单独相当于“0.00; -0.00”。如果有的话   显式否定子模式,它仅用于指定负数   前缀和后缀;数字位数,最小数字和其他数字   特征与正模式完全相同。这意味着   “#,## 0.0#;(#)”产生的行为完全相同   “#,## 0.0#;(#,## 0.0#)”

答案 3 :(得分:1)

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

您可以将代码封装为

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;
    }

答案 4 :(得分: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");

答案 5 :(得分:0)

我发现-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的格式不同,但它们是相同的。

答案 6 :(得分:0)

Bohemian's answer的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
}