人民币-数字小写转大写--Java

2019-03-06  本文已影响0人  MachaelSui

金额小写数字转为大写

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

/*-金额数字转换为大写-*/
public class NumToCNRMB{
   /*汉语中数字大写*/
   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_FUNLL = "零元" + CN_FULL;
   
   public static String number2CNMontrayUnit(double numberMoneyPar){
       //double numberMoneyPar = 1234.56;//转换金额参数
       BigDecimal numberOfMoney = new BigDecimal(numberMoneyPar);
       StringBuffe sb = new StringBuffe();
       //-1,0,or 1 as the value of this BigDecimal is nagative , zero ,or
       // positive
       int signum = numberOfMoney.signum();
       //零元整的情况
       if(signum == 0 ){
           return CN_ZEOR_FUNLL;
       }
   
       //这里会进行金额的四舍五入
       long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0,4).abs().longValue();
       //得到小数点后两位值
       long scale = number % 100;
       int numUnit = 0 ;
       int numIndex = 0;
       bollean 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 % 100 > 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.insert(CN_FULL);
       }
       return sb.toString();
   }

   public static void main(String[] args){
       Scanner scanner = new Scanner(System.in);
       while(true){
            System.out.print("金额: ");
            BigDecimal m = scanner.nextBigdecimal(); 
            System.out.pringln(NumberToCNRMB.number2CNMontrayUnit(m));
       }
   }
       
}
上一篇下一篇

猜你喜欢

热点阅读