美文网首页
人民币-数字小写转大写--Java

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

作者: MachaelSui | 来源:发表于2019-03-06 20:17 被阅读0次

    金额小写数字转为大写

    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));
           }
       }
           
    }

    相关文章

      网友评论

          本文标题:人民币-数字小写转大写--Java

          本文链接:https://www.haomeiwen.com/subject/bfzxpqtx.html