一开始为了方便,就直接拿
String.format("%.2f", 0.001) // 结果 0.00
这个处理,但是很明显不符合需求,因为如果出现
String.format("%.2f", -0.001) // 结果 -0.00
那么得出的结果就是 -0.00,四舍五入之后还是保留了符号,如果只是私有项目倒没什么问题但是如果是公司通过接口形式给前端的数据,前端就会显得很奇怪。
那么怎么也得有个处理或者加个
String res = String.format("%.2f", -0.001);
res = "-0.00".equals(res) ? "0.00": res; // 结果 0.00
不过就只有这个 0.00 的符号问题不符合需求,一旦场景多了,业务代码一样复杂。
具体代码:
其实跟踪代码就发现,"%.2f" 的 f 是表示这个
Conversion.DECIMAL_FLOAT // 十进制的浮点
然后就调用
FormatSpecifier.printFloat(v, l);
继续往下看就看到,具体转 double 代码是怎么回事
......
......
boolean neg = Double.compare(value, 0.0) == -1; // 这里已经判断了 -0.001 的符号
if (!Double.isNaN(value)) {
double v = Math.abs(value);
// leading sign indicator
leadingSign(sb, neg); // 就是这里给返回字符串拼上 "-"
......
......
leadingSign 就是一拼符号的方法
private StringBuilder leadingSign(StringBuilder sb, boolean neg) {
if (!neg) {
if (f.contains(Flags.PLUS)) {
sb.append('+');
} else if (f.contains(Flags.LEADING_SPACE)) {
sb.append(' ');
}
} else {
if (f.contains(Flags.PARENTHESES))
sb.append('(');
else
sb.append('-');
}
return sb;
}
Flags.PLUS 是 "+" 加加号 只有 double 是正数才显示,而 Flags.PARENTHESES 是加括号 只有 double 是负数才显示
可以玩玩看
System.out.println(String.format("%(.2f", -0.001)); // (0.00)
System.out.println(String.format("%+.2f", 0.001)); // +0.00
如果业务场景能够说 正数 拼 + 而负数 拼 () 括号,那么这样处理就方便
System.out.println(String.format("%+(.2f", 0.001)); // +0.00
System.out.println(String.format("%+(.2f", -0.001)); // (0.00)