BigDecimal 转 String

简介: BigDecimal 转 String

强烈推荐一个大神的人工智能的教程: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出来的准确度还是有一些)。


相关文章
|
7月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
127 0
|
4月前
|
安全 Java
12 Java常用类(二)(String类+时间类+BigDecimal类等等)
12 Java常用类(二)(String类+时间类+BigDecimal类等等)
43 2
|
7月前
BigDecimal转String
BigDecimal转String
49 0
|
前端开发 Java
BigDecimal转String
BigDecimal转String
397 0
java BigDecimal(String val)确保小数点后有效位数 ✨ 每日积累
java BigDecimal(String val)确保小数点后有效位数 ✨ 每日积累
|
3月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
46 0
java基础(13)String类
|
27天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
48 2
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
68 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
52 2