java把金额数字装换为汉字大写

package com.anta.util;

 

import java.math.BigDecimal;

 

/**

* @ClassName: NumberToCN

* @Description: 金额数字转换为中文大写

* @date 2017年12月20日 上午9:19:58

*

* feng 

*/

public class NumberToCN {

 /**

       * 汉语中数字大写

      */

     private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆",

             "伍", "陆", "柒", "捌", "玖" };

   /**

      * 汉语中货币单位大写,这样的设计类似于占位符

      */

     private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元",

             "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾",

              "佰", "仟" };

      /**

       * 特殊字符:整

       */

      private static final String CN_FULL = "整";

      /**

     * 特殊字符:负

       */

     private static final String CN_NEGATIVE = "负";

     /**

      * 金额的精度,默认值为2

      */

     private static final int MONEY_PRECISION = 2;

      /**

      * 特殊字符:零元整

      */

     private static final String CN_ZEOR_FULL = "零元" + CN_FULL;

 

     /**

       * 把输入的金额转换为汉语中人民币的大写

       *

       * @param numberOfMoney

       *            输入的金额

       * @return 对应的汉语大写

       */

      public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {

          StringBuffer sb = new StringBuffer();

          // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or

          // positive.

          int signum = numberOfMoney.signum();

          // 零元整的情况

          if (signum == 0) {

              return CN_ZEOR_FULL;

         }

         //这里会进行金额的四舍五入

          long number = numberOfMoney.movePointRight(MONEY_PRECISION)

                  .setScale(0, 4).abs().longValue();

          // 得到小数点后两位值

          long scale = number % 100;

          int numUnit = 0;

          int numIndex = 0;

          boolean getZero = false;

         // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11

         if (!(scale > 0)) {

             numIndex = 2;

             number = number / 100;

              getZero = true;

          }

          if ((scale > 0) && (!(scale % 10 > 0))) {

              numIndex = 1;

              number = number / 10;

              getZero = true;

          }

        int zeroSize = 0;

         while (true) {

              if (number <= 0) {

                 break;

              }

            // 每次获取到最后一个数

              numUnit = (int) (number % 10);

            if (numUnit > 0) {

                 if ((numIndex == 9) && (zeroSize >= 3)) {

                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);

                }

                 if ((numIndex == 13) && (zeroSize >= 3)) {

                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);

                  }

                sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);

                 sb.insert(0, CN_UPPER_NUMBER[numUnit]);

                getZero = false;

               zeroSize = 0;

            } else {

                ++zeroSize;

                if (!(getZero)) {

                     sb.insert(0, CN_UPPER_NUMBER[numUnit]);

                }

               if (numIndex == 2) {

                    if (number > 0) {

                        sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);

                   }

                 } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {

                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);

                }

                getZero = true;

            }

            // 让number每次都去掉最后一个数

            number = number / 10;

            ++numIndex;

       }

        // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负

        if (signum == -1) {

           sb.insert(0, CN_NEGATIVE);

         }

         // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整

         if (!(scale > 0)) {

             sb.append(CN_FULL);

        }

         return sb.toString();

     }

    public static void main(String[] args) {

     

        double money = 1222;

        BigDecimal numberOfMoney = new BigDecimal(money);

        String s = NumberToCN.number2CNMontrayUnit(numberOfMoney);

        System.out.println("你输入的金额为:【"+ money +"】   #--# [" +s.toString()+"]");

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值