强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan
【前言】
最近遇到一个需求,是给用户发送带钱的短信,本来自己以为挺简单,很快可以搞定,不过在实现的时候遇到一些小问题,自己辗转查和实验最终解决该问题,在此记录一下。
【BigDecimal如何转成String】
一、业务需求
1、数据库中有相应的用户金额,需要发短信通知告诉用户;
2、短信内容设计采用:固定内容+变量(占位符{0})具体参考《Java 巧用占位符》;
3、用户金额(BigDecimal)是其中的变量,需要将金额BigDecimal转换成String类型;
4、产品要求金额在短信中的显示样式:
(1)数据库:1888.00—>短信中显示:1888
(2)数据库:1888.10—>短信中显示:1888.1
(3)数据库:1888.11—>短信中显示:1888.11
二、相关代码及测试
1、尝试一:首先想到的直接是BigDecimal.toString方式;
(1)代码
public static void main(String[] args) {
//短信模版
String mod = "{0} 先生/女士,您好!您的尾号({1})的银行卡,余额是({2})元";
//模拟从数据库中取出金额
BigDecimal bigDecimalValue = new BigDecimal(1888.10);
//拼接短信变量
String variable = "张三;567;" + bigDecimalValue.toString();
//组合短信内容:模版+变量
String context = MessageFormat.format(mod, variable.split(";"));
//测试输出 短信内容
System.out.println(context);
}
(2)测试结果
张三 先生/女士,您好!您的尾号(567)的银行卡,余额是(1888.09999999999990905052982270717620849609375)元
(3)结论:金额转为科学计数法,很显然不符合我们的要求;
2、尝试二:针对尝试一问题,想到保留小数位方式
(1)代码
public static void main(String[] args) {
//短信模版
String mod = "{0} 先生/女士,您好!您的尾号({1})的银行卡,余额是({2})元";
//模拟从数据库中取出金额
BigDecimal bigDecimalValue = new BigDecimal(1888.10);
//保留两位小数
String strValue = bigDecimalValue.setScale(2, BigDecimal.ROUND_HALF_DOWN).toString();
//拼接短信变量
String variable = "张三;567;" + strValue;
//组合短信内容:模版+变量
String context = MessageFormat.format(mod, variable.split(";"));
//测试输出 短信内容
System.out.println(context);
}
(2)测试结果
张三 先生/女士,您好!您的尾号(567)的银行卡,余额是(1888.10)元
(3)结论:虽然比尝试一显示好很多,但是仍然不符合产品需求(产品需求是1888.10要显示成1888.1)
3、尝试三:将BigDecimal转换为double再进行取值
(1)代码
public static void main(String[] args) {
//短信模版
String mod = "{0} 先生/女士,您好!您的尾号({1})的银行卡,余额是({2})元";
//模拟从数据库中取出金额
BigDecimal bigDecimalValue = new BigDecimal(1888.10);
//保留两位小数
String strValue =bigDecimalToString(bigDecimalValue);
//拼接短信变量
String variable = "张三;567;" + strValue;
//组合短信内容:模版+变量
String context = MessageFormat.format(mod, variable.split(";"));
//测试输出 短信内容
System.out.println(context);
}
//将BigDecimal取为Double然后转为String方式
private static String bigDecimalToString(BigDecimal bigDecimalValue){
NumberFormat cf = NumberFormat.getInstance();
double taxD = bigDecimalValue.doubleValue();
String strValue = cf.format(taxD).replace(",", "");
return strValue;
}
(2)测试结果
张三 先生/女士,您好!您的尾号(567)的银行卡,余额是(1888.1)元
(3)结论:
A、测了一些数据符合我们的要求;
B、如果大家看这种方式的实现方式不难发现将BigDecimal转为Double时精度会有丢失;当数据位数很多时会有问题;例如:188888888888888888888.10 转换后为 188888888888888900000
C、针对位数过多数据错乱,查看一下我们数据库字段类型为 decimal(20,8) 也金钱是保留小数点后两位,也就是存的最大数值为 999999999999.99 而将最大值用转换程序测试一下是支持的,故满足需求;测试结果如下:
张三 先生/女士,您好!您的尾号(567)的银行卡,余额是(999999999999.99)元
【总结】
1、思想上移,行动下移;
2、方法总比困难多;
3、逐渐体会到英语重要性(在找计算机专业方案时,百度出来的结果和Google出来的准确度还是有一些)。
今天的文章bigdecimal转string保留小数_java用什么编辑器[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69967.html