java中零的负号

java中零的负号,java,Java,当结果返回零时,有没有办法截断负号;使用十进制格式时 DecimalFormat df = new DecimalFormat("#,##0.0"); df.setRoundingMode(RoundingMode.HALF_UP); formattedValue = df.format("-0.023"); 上面的代码返回-0.0。是否有任何方法可以使它只返回0.0?但是,当结果为负数时,我希望保留负号。尝试以下操作:DecimalFormat df=new DecimalFormat(“#

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

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

上面的代码返回-0.0。是否有任何方法可以使它只返回0.0?但是,当结果为负数时,我希望保留负号。

尝试以下操作:
DecimalFormat df=new DecimalFormat(“#,#,#0.0#)(#,#0.0#”)

根据报告:

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


通过检查计算值是否为=“-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;
    }

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

我不认为只有
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
非常有用,因为它告诉您舍入值实际上是负数(这对某些函数可能有很多意义)。对我来说唯一的问题是
-1*0
实际上是0,应该格式化为
0
,尽管它不使用Java格式化程序

下面的格式化程序可以解决这个问题,而不需要昂贵的字符串操作成本(特别是regexp):

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

Kotlin版本的:


速度更快,精度任意(还支持忽略后缀,例如货币,0表示无后缀):


我收到一个错误:
无法将给定对象格式化为数字。您应该使用值
-0.023
而不是字符串
“-0.023”
我已经将上面的代码放在了一个实用方法中。虽然它适用于0.0;它不适用于其他需要保留-ve符号的负数。重置负前缀没有任何效果,因为每次创建DecimalFormat实例时都会这样做。您不应该在实用程序类中设置变通方法。让它放在您使用它的地方,并用类似//FIXME的标记标记它。所以下一次,如果你找到更好的解决方案,你可以实现它。如果您打算对不同的数字再次使用
df
实例,我会有意重置上面的
负前缀。如果要使用
新实例
,则不需要这样做。这可以工作,但会成为一个显式检查。如果值为-0.00等,则不起作用。如果您使用的货币格式化程序的货币符号在零之前,您可能希望将正则表达式更改为“
”^-(?=\D*0(.0*)?$)”
(注意\D*将匹配任何非数字字符零次或多次),这应该匹配以下字符串:
-$0
,你能给我们用Kotlin语言的正则表达式吗?它在Kotlin上不起作用,但仍然得到
-0
@Dr.jacky-AFAIK Kotlin在语法上优于java,所以它应该按原样工作。检查您如何编码/使用正则表达式。你能发布你的代码吗?有许多国家使用逗号“,”作为小数点分隔符。您可能还需要处理这种情况:
“^-(?=0([,]0*)?$)”
@jackes为什么不包括阿拉伯语和印地语数字呢?这段代码展示了一种可以适应特定情况的技术,而不是持久的全局规范。
0.0
12.1
-12.3
-0.1
-1.8
public static String formatWithoutMinusZeroIssue(double d, DecimalFormat yourFormatter) {
    if (d == 0) {
        return yourFormatter.format(0);
    } else {
        return yourFormatter.format(d);
    }
}
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
}
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");