强烈推荐一个大神的人工智能的教程:http://www.captainbed.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相关推荐

  1. java中的 BigDecimal 和 String 的相互转换

    例子1,string 转BigDecimalpublic class Test{ public static void main(String[] arg) { String str1="2 ...

  2. java中的BigDecimal与String的相互转换以及compareTo()方法的使用

    文章目录 1:String类型转BigDecimal类型 2:BigDecimal类型转String类型 3:比较两个BigDecimal值:是否还是使用equals? compareTo()方法 拓 ...

  3. BigDecimal转String

    获取到的Map<String, String>集合是 BigDecimal类型的值,如果直接转换为String类型则报错:java.math.BigDecimal cannot be ca ...

  4. BigDecimal转String,int,double及简单操作运算、方法

    ---恢复内容开始--- 1.字符型数据: char\varchar\text 这几种数据类型都是用来装字符串的 char 固定长度存储数据 varcahr 按变长存储数据 text 当你需要存储非常 ...

  5. java string转decimal_java中string转bigdecimal的例子

    小编知道在java中数据类型非常 的严格了,我们如果一个地方不小心就会导致应用出问题了,今天 小编就在string 转BigDecimal上碰到了一些问题,下面整理了几个例子大家一起来看看. 例子1, ...

  6. string 与BigDecimal互转

    小编知道在java中数据类型非常 的严格了,我们如果一个地方不小心就会导致应用出问题了,今天 小编就在string 转BigDecimal上碰到了一些问题,下面整理了几个例子大家一起来看看. 例子1, ...

  7. Java中BigDecimal工具类(支持空值运算版)

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 需要计算的场景绕不过去会使用BigDecimal类, ...

  8. BigDecimal 类型转换、运算、比较

    序:Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数 ...

  9. Java除法不精确引入BigDecimal

    前言: 之前在项目里遇到一个问题:169/100=1.0 int nPtCount = 169; final int MAX_ROUTE_PT = 100; double lfDivide = 0;i ...

最新文章

  1. 基于改进的点对特征的6D位姿估计
  2. [Java]Stack栈和Heap堆的区别(终结篇)[转]
  3. python发明者叫什么-看看9种编程语言的发明者是怎么说的
  4. 空谈Saas都扯淡,让你看看真正的云计算
  5. 【C++学习笔记五】模板
  6. 【LeetCode】【HOT】236. 二叉树的最近公共祖先(递归)
  7. php mysql 连接类_深入理解php的MySQL连接类
  8. 《数据结构与算法分析》习题-----第二章(3)(关于list的题目)
  9. gitgithub拾遗(一)——git
  10. java毕业设计万科集团社区管理系统mybatis+源码+调试部署+系统+数据库+lw
  11. origin 图片导出word
  12. java微信公众号百度地图,微信公众号集成百度地图api,实现收货地址选择
  13. ie11无法使用,卸载后无法安装,错误代码0x8000ffff
  14. java群面自我介绍,群面的一分钟自我介绍
  15. 最全的Python教程【合集】| 寻找C站宝藏
  16. Kubernetes 进阶训练营 控制器
  17. 【读书笔记】《能力陷阱》——改变思想从行动开始
  18. 商人必看的20大电影
  19. 大数据时代的背景与变化
  20. SpringBoot整合Activiti7

热门文章

  1. 意大利不禁止华为;13 款 5G 手机时间表公布;亚马逊 CEO 遭威胁 | 极客头条
  2. 中国首个!百度云宣布边缘计算开源,发布智能边缘开源平台OpenEdge
  3. 区块链开发人员短缺?各大公司献上连环招
  4. 那些终将消亡和被取代的科技产品
  5. STM32学习:外部中断
  6. mysql 8.0 安装_安装MySQL-8.0.19
  7. .net 遍历数组找重复值写入一个新数组_第二轮 Python 刷题笔记一:数组
  8. centos7 无法yum安装mysql_CentOS7 安装mysql(YUM源方式)
  9. html5 history api_window.history的跳转探索
  10. mysql数据设置浮动_浮动float