【前言】

        最近遇到一个需求,是给用户发送带钱的短信,本来自己以为挺简单,很快可以搞定,不过在实现的时候遇到一些小问题,自己辗转查和实验最终解决该问题,在此记录一下。

【BigDecimal如何转成String】

        一、业务需求

               1、数据库中有相应的用户金额,需要发短信通知告诉用户;

               2、短信内容设计采用:固定内容+变量(占位符{0})

               3、用户金额(BigDecimal)是其中的变量,需要将金额BigDecimal转换成String类型;

               4、产品要求金额在短信中的显示样式:

1888.00--->短信中显示:1888

1888.10--->短信中显示:1888.1

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)元

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、测了一些数据符合我们的要求;

188888888888888888888.10 转换后为 188888888888888900000 

999999999999.99

张三 先生/女士,您好!您的尾号(567)的银行卡,余额是(999999999999.99)元

        

【总结】

        1、思想上移,行动下移;

        2、方法总比困难多;

        3、逐渐体会到英语重要性(在找计算机专业方案时,百度出来的结果和Google出来的准确度还是有一些)。