zoukankan      html  css  js  c++  java
  • java开发_数字转换汉语中人民币的大写_完整版

    转自:https://www.cnblogs.com/hongten/p/hongten_java_money.html

    做这个应用,源于突然的一个想法:看到发票上面的数字要转换成汉语中人民币的大写

    于是就有了下面的这些事儿.....

    先看看运行效果:

    ======================================================

    代码部分

    ======================================================

      1 package com.b510.number2char;
      2 
      3 import java.math.BigDecimal;
      4 
      5 /**
      6  * 数字转换为汉语中人民币的大写<br>
      7  * 
      8  * @author hongten
      9  * @contact hongtenzone@foxmail.com
     10  * @create 2013-08-13
     11  */
     12 public class NumberToCN {
     13     /**
     14      * 汉语中数字大写
     15      */
     16     private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆",
     17             "伍", "陆", "柒", "捌", "玖" };
     18     /**
     19      * 汉语中货币单位大写,这样的设计类似于占位符
     20      */
     21     private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元",
     22             "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾",
     23             "佰", "仟" };
     24     /**
     25      * 特殊字符:整
     26      */
     27     private static final String CN_FULL = "整";
     28     /**
     29      * 特殊字符:负
     30      */
     31     private static final String CN_NEGATIVE = "负";
     32     /**
     33      * 金额的精度,默认值为2
     34      */
     35     private static final int MONEY_PRECISION = 2;
     36     /**
     37      * 特殊字符:零元整
     38      */
     39     private static final String CN_ZEOR_FULL = "零元" + CN_FULL;
     40 
     41     /**
     42      * 把输入的金额转换为汉语中人民币的大写
     43      * 
     44      * @param numberOfMoney
     45      *            输入的金额
     46      * @return 对应的汉语大写
     47      */
     48     public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {
     49         StringBuffer sb = new StringBuffer();
     50         // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or
     51         // positive.
     52         int signum = numberOfMoney.signum();
     53         // 零元整的情况
     54         if (signum == 0) {
     55             return CN_ZEOR_FULL;
     56         }
     57         //这里会进行金额的四舍五入
     58         long number = numberOfMoney.movePointRight(MONEY_PRECISION)
     59                 .setScale(0, 4).abs().longValue();
     60         // 得到小数点后两位值
     61         long scale = number % 100;
     62         int numUnit = 0;
     63         int numIndex = 0;
     64         boolean getZero = false;
     65         // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
     66         if (!(scale > 0)) {
     67             numIndex = 2;
     68             number = number / 100;
     69             getZero = true;
     70         }
     71         if ((scale > 0) && (!(scale % 10 > 0))) {
     72             numIndex = 1;
     73             number = number / 10;
     74             getZero = true;
     75         }
     76         int zeroSize = 0;
     77         while (true) {
     78             if (number <= 0) {
     79                 break;
     80             }
     81             // 每次获取到最后一个数
     82             numUnit = (int) (number % 10);
     83             if (numUnit > 0) {
     84                 if ((numIndex == 9) && (zeroSize >= 3)) {
     85                     sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
     86                 }
     87                 if ((numIndex == 13) && (zeroSize >= 3)) {
     88                     sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
     89                 }
     90                 sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
     91                 sb.insert(0, CN_UPPER_NUMBER[numUnit]);
     92                 getZero = false;
     93                 zeroSize = 0;
     94             } else {
     95                 ++zeroSize;
     96                 if (!(getZero)) {
     97                     sb.insert(0, CN_UPPER_NUMBER[numUnit]);
     98                 }
     99                 if (numIndex == 2) {
    100                     if (number > 0) {
    101                         sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
    102                     }
    103                 } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {
    104                     sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
    105                 }
    106                 getZero = true;
    107             }
    108             // 让number每次都去掉最后一个数
    109             number = number / 10;
    110             ++numIndex;
    111         }
    112         // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
    113         if (signum == -1) {
    114             sb.insert(0, CN_NEGATIVE);
    115         }
    116         // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
    117         if (!(scale > 0)) {
    118             sb.append(CN_FULL);
    119         }
    120         return sb.toString();
    121     }
    122 
    123     public static void main(String[] args) {
    124         double money = 2020004.01;
    125         BigDecimal numberOfMoney = new BigDecimal(money);
    126         String s = NumberToCN.number2CNMontrayUnit(numberOfMoney);
    127         System.out.println("你输入的金额为:【"+ money +"】   #--# [" +s.toString()+"]");
    128     }
    129 }
  • 相关阅读:
    Cobbler自动装机试验
    内嵌元素、块元素、内联块的区分以及内嵌元素的问题
    内嵌元素、块元素、内联块的区分以及内嵌元素的问题
    MyEclipse构建WebService案例
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/sharpest/p/6346473.html
Copyright © 2011-2022 走看看