许多时候我们觉得可能解决不了的问题,偏偏产品经理就会提出来,大多数是可以理解的,毕竟自己站在客户的角度也是合理的.
前段时间我在开发一个打印功能,打印的字段涉及到数字(BigDecimal),如果不做处理,即便是整数也会带上长长的全0小数位,产品经理看完之后——改.
一开始我并不知道BigDecimal有个API是可以去掉小数位后多余的0的.后面多亏同事出手相助,其实百度也能百度到,但是当时我的脑子就是在我的知识范围内去思考怎么实现,而我的知识又很窄,想了半天觉得本来就需要根据用户设定的保留位数保留小数位了,还要去掉多余的0,这小数位就没办法统一.第一反应就是实现不了.
下面就演示一下如何在设定好保留位数之后,去掉多余的0.
上图仅仅是保留一定位数之后的结果,而并不是我们上面想要的结果.
package cn.bugstack.springframework;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalTest {
private static final Integer scaleLength = 6;
public static void main(String[] args) {
BigDecimal bd1 = BigDecimal.valueOf(123.00000000);
bd1 = bd1.setScale(scaleLength, RoundingMode.HALF_UP);
// 把多余的0去掉
BigDecimal res = bd1.stripTrailingZeros();
System.out.println("bd1 = " + bd1);
System.out.println("res = " + res);
}
}
运行结果
其实按照上面的例子来说,原本到这里就可以了,但是stripTrailingZeros()这个方法会有一个科学记数法的转换.
package cn.bugstack.springframework;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalTest {
private static final Integer scaleLength = 6;
public static void main(String[] args) {
BigDecimal bd1 = BigDecimal.valueOf(123.00000000);
bd1 = bd1.setScale(scaleLength, RoundingMode.HALF_UP);
// 把多余的0去掉
BigDecimal res = bd1.stripTrailingZeros();
System.out.println("bd1 = " + bd1);
System.out.println("res = " + res);
// 当整数位后面都是0的时候,会变成科学计数法
BigDecimal bd2 = BigDecimal.valueOf(1230000.00000000);
bd2 = bd2.stripTrailingZeros();
System.out.println("bd2 = " + bd2);
}
}
运行结果:
当然到这里依然不是产品经理想要的样子.但是相信方法总比困难多.
package cn.bugstack.springframework;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalTest {
private static final Integer scaleLength = 6;
public static void main(String[] args) {
BigDecimal bd1 = BigDecimal.valueOf(123.00000000);
bd1 = bd1.setScale(scaleLength, RoundingMode.HALF_UP);
// 把多余的0去掉
BigDecimal res = bd1.stripTrailingZeros();
System.out.println("bd1 = " + bd1);
System.out.println("res = " + res);
// 当整数位后面都是0的时候,会变成科学计数法
BigDecimal bd2 = BigDecimal.valueOf(1230000.00000000);
bd2 = bd2.stripTrailingZeros();
String res1 = bd2.toPlainString();
System.out.println("bd2 = " + bd2);
System.out.println("res1 = " + res1);
}
}
运行结果:
到这最终达到了产品经理想要的效果.
最后一步的时候需要注意,是toPlaninString(),而不是toString(),toString()只是简单变成一个String类型,并没有解决科学技术的问题.