当结果返回零时,有没有办法截断负号;使用十进制格式时?
DecimalFormat df = new DecimalFormat("#,##0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
formattedValue = df.format("-0.023");
上面的代码返回-0.0。它有什么方法可以返回0.0吗?但是,当结果是负数时,我想保留负号。
答案 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#)");
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 * 0
和0
的格式不同,但它们是相同的。
答案 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
}