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");