实例10人民币金额转换成大写格式

/ java精彩编程200例 / 没有评论 / 112浏览

实例010人民币金额转换成大写格式

我不会。。。。看不懂while循环最后的那一部分,很迷。。。先放到这里吧,以后懂了会再来更新的。。。。。

package java10;

import java.math.BigDecimal; import java.util.Scanner;

public class ConvertMoney { /** * 数字转换为汉语中人民币的大写 * * @author hongten * @contact hongtenzone@foxmail.com * @create 2013-08-13 / /* * 汉语中数字大写 / 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 对应的汉语大写
       */

      //用来对超过16位有效位的数进行精确的运算
      public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {
          StringBuffer sb = new StringBuffer();
          //返回此BigDecimal的正负号函数,正数返回1,负数返回-1,0返回0
          int signum = numberOfMoney.signum();

          // 零元整的情况
          if (signum == 0) {
              return CN_ZEOR_FULL;
          }
          //这里会进行金额的四舍五入,小数点向右两位(方便取出小数点后两位),setScale(0,4)保留零位小数,四舍五入,  最后转换成long型
          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 / 100;
              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]);
                  }
                  //前边已经得出小数位的数值情况,比如小数部分为0,numIndex=2时,就是****元,于是取出CN_UPPER_MONETRAY_UNIT[2]对应的元
                  sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
                  //同理,前边用%10得到的整数部分的最后一个数,于是取出CN_UPPER_NUMBER[numUnit]对应的字符串,然后加入到可变字符串中
                  sb.insert(0, CN_UPPER_NUMBER[numUnit]);
                  getZero = false;
                  zeroSize = 0;
              } else {//取出的整数的某个位置的数为0时
                  ++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) {
         Scanner scanner = new Scanner(System.in);
         System.out.println("请输入金额:");
         double money = scanner.nextDouble();
         BigDecimal numberOfMoney = new BigDecimal(money);
         String s = ConvertMoney.number2CNMontrayUnit(numberOfMoney);
         System.out.println("转换后金额为:\n" +s.toString());
    }
 }

实现结果: