07Java人民幣處理工具

/**
 *<html>
 *<body>
 *  <P> Copyright  ● JasonInternational </p>
 *  <p> All rights reserved.</p>
 *  <p> Created by Jason see https://github.com/Jasonandy/springboot-wx </p>
 *</body>
 *</html>
 */
package cn.ucaner.skeleton.common.utils.base;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
* @Package:cn.ucaner.wx.app.core.utils.base   
* @ClassName:MoneyUtils   
* @Description:   <p> 人民幣處理工具 </p>
* @Author: - Jason   
* @CreatTime:2018年10月23日 下午7:47:32   
* @Modify By:   
* @ModifyTime:  2018年10月23日
* @Modify marker:   
* @version    V1.0
 */
public class MoneyUtils {
    
    /**
     * 漢語中數(shù)字大寫
     */
     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 = "負";
     /**
      * 零元整
      */
     private static final String CN_ZEOR_FULL = "零元整";
     
     /**
      * 金額的精度,默認值為2
      */
     private static final int MONEY_PRECISION = 2;
     
     /**
      * 人民幣轉(zhuǎn)換為大寫,格式為:x萬x千x百x十x元x角x分
      * @param numberOfMoney 傳入的金額
      * @return
      */
     public static String number2CNMontray(String numberOfMoney) {
         return number2CNMontray(new BigDecimal(numberOfMoney));
     }
     

    /**
     * 人民幣轉(zhuǎn)換為大寫,格式為:x萬x千x百x十x元x角x分
     * @param numberOfMoney
     *                  傳入的金額
     * @return
     */
    public static String number2CNMontray(BigDecimal numberOfMoney) {
        StringBuffer sb = new StringBuffer();
        int signum = numberOfMoney.signum();
        // 零元整的情況
        if (signum == 0) {
            return CN_ZEOR_FULL;
        }
        //這里會進行金額的四舍五入
        long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0, 4).abs().longValue();
        // 得到小數(shù)點后兩位值
        long scale = number % 100;
        int numUnit = 0;
        int numIndex = 0;
        boolean getZero = false;
        // 判斷最后兩位數(shù),一共有四中情況: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;
            }
            // 每次獲取到最后一個數(shù)
            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每次都去掉最后一個數(shù)
            number = number / 10;
            ++numIndex;
        }
        // 如果signum == -1,則說明輸入的數(shù)字為負數(shù)恨胚,就在最前面追加特殊字符:負
        if (signum == -1) {
            sb.insert(0, CN_NEGATIVE);
        }
        // 輸入的數(shù)字小數(shù)點后兩位為"00"的情況,則要在最后追加特殊字符:整
        if (!(scale > 0)) {
            sb.append(CN_FULL);
        }
        return sb.toString();
    }
    
    /**
     * 將人民幣轉(zhuǎn)換為會計格式金額(xxxx,xxxx,xxxx.xx),保留兩位小數(shù)
     *
     * @param money
     *              待轉(zhuǎn)換的金額
     * @return
     */
    public static String accountantMoney(BigDecimal money){
        return accountantMoney(money, 2, 1);
    }
    
    /**
     * 格式化金額州既,顯示為xxx萬元锨阿,xxx百萬,xxx億
     * @param money 
     *              待處理的金額
     * @param scale  
     *              小數(shù)點后保留的位數(shù)
     * @param divisor 
     *              格式化值(10:十元酣衷、100:百元,1000千元树碱,10000萬元......)
     * @return
     */
    public static String getFormatMoney(BigDecimal money,int scale,double divisor){
        return formatMoney(money, scale, divisor) + getCellFormat(divisor);
    }
    
    /**
     * 獲取會計格式的人民幣(格式為:xxxx,xxxx,xxxx.xx)
     * @param money 
     *              待處理的金額
     * @param scale 
     *              小數(shù)點后保留的位數(shù)
     * @param divisor 
     *              格式化值(10:十元肯适、100:百元,1000千元,10000萬元......)
     * @return
     */
    public static String getAccountantMoney(BigDecimal money, int scale, double divisor){  
        return accountantMoney(money, scale, divisor) + getCellFormat(divisor);
    }  
    
    /**
     * 將人民幣轉(zhuǎn)換為會計格式金額(xxxx,xxxx,xxxx.xx)
     * @param money 
     *              待處理的金額
     * @param scale 
     *              小數(shù)點后保留的位數(shù)
     * @param divisor 
     *              格式化值
     * @return
     */
    private static String accountantMoney(BigDecimal money,int scale,double divisor){
        String disposeMoneyStr = formatMoney(money, scale, divisor);  
        //小數(shù)點處理  
        int dotPosition = disposeMoneyStr.indexOf(".");  
        String exceptDotMoeny = null;//小數(shù)點之前的字符串  
        String dotMeony = null;//小數(shù)點之后的字符串  
        if(dotPosition > 0){  
            exceptDotMoeny = disposeMoneyStr.substring(0,dotPosition);  
            dotMeony = disposeMoneyStr.substring(dotPosition);  
        }else{  
            exceptDotMoeny = disposeMoneyStr;  
        }  
        //負數(shù)處理  
        int negativePosition = exceptDotMoeny.indexOf("-");  
        if(negativePosition == 0){  
            exceptDotMoeny = exceptDotMoeny.substring(1);  
        }  
        StringBuffer reverseExceptDotMoney = new StringBuffer(exceptDotMoeny);  
        reverseExceptDotMoney.reverse();//字符串倒轉(zhuǎn)  
        char[] moneyChar = reverseExceptDotMoney.toString().toCharArray();  
        StringBuffer returnMeony = new StringBuffer();//返回值  
        for(int i = 0; i < moneyChar.length; i++){  
            if(i != 0 && i % 3 == 0){  
                returnMeony.append(",");//每隔3位加','  
            }  
            returnMeony.append(moneyChar[i]);  
        }  
        returnMeony.reverse();//字符串倒轉(zhuǎn)  
        if(dotPosition > 0){  
            returnMeony.append(dotMeony);  
        }  
        if(negativePosition == 0){  
            return "-" + returnMeony.toString();  
        }else{  
            return returnMeony.toString();  
        }  
    }
    
    /**
     * 格式化金額赴恨,顯示為xxx萬元疹娶,xxx百萬,xxx億
     * @param money 
     *              待處理的金額
     * @param scale  
     *              小數(shù)點后保留的位數(shù)
     * @param divisor 
     *              格式化值
     * @return
     */
    private static String formatMoney(BigDecimal money,int scale,double divisor){
        if (divisor == 0) {
            return "0.00";
        }
        if (scale < 0) {
            return "0.00";
        }
        BigDecimal divisorBD = new BigDecimal(divisor);
        return money.divide(divisorBD, scale, RoundingMode.HALF_UP).toString();
    }
    
    private static String getCellFormat(double divisor){
        String str = String.valueOf(divisor);
        int len = str.substring(0,str.indexOf(".")).length();
        String cell = "";
        switch(len){
            case 1:
                cell = "元";
                break;
            case 2:
                cell = "十元";
                break;
            case 3:
                cell = "百元";
                break;
            case 4:
                cell = "千元";
                break;
            case 5:
                cell = "萬元";
                break;
            case 6:
                cell = "十萬元";
                break;
            case 7:
                cell = "百萬元";
                break;
            case 8:
                cell = "千萬元";
                break;
            case 9:
                cell = "億元";
                break;
            case 10:
                cell = "十億元";
                break;
        }
        return cell;
    }
    
    /**
     * @Description: Test
     * @Autor: jasonandy@hotmail.com
     */
    public static void main(String[] args) {
        String number2cnMontray = number2CNMontray("1234567890");
        String number2cnMontray2 = number2CNMontray("18688409999.12345678");
        System.out.println(number2cnMontray);
        System.out.println(number2cnMontray2);
    }
}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伴栓,一起剝皮案震驚了整個濱河市伦连,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钳垮,老刑警劉巖惑淳,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饺窿,居然都是意外死亡歧焦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绢馍,“玉大人向瓷,你說我怎么就攤上這事〗⒂浚” “怎么了猖任?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓷耙。 經(jīng)常有香客問我朱躺,道長,這世上最難降的妖魔是什么搁痛? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任长搀,我火速辦了婚禮,結(jié)果婚禮上鸡典,老公的妹妹穿的比我還像新娘源请。我一直安慰自己,他們只是感情好轿钠,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布巢钓。 她就那樣靜靜地躺著,像睡著了一般疗垛。 火紅的嫁衣襯著肌膚如雪症汹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天贷腕,我揣著相機與錄音背镇,去河邊找鬼。 笑死泽裳,一個胖子當著我的面吹牛瞒斩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涮总,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼胸囱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瀑梗?” 一聲冷哼從身側(cè)響起烹笔,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抛丽,沒想到半個月后谤职,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡亿鲜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年允蜈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡饶套,死狀恐怖漩蟆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妓蛮,我是刑警寧澤爆安,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站仔引,受9級特大地震影響扔仓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咖耘,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一翘簇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儿倒,春花似錦版保、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凰慈,卻和暖如春汞幢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背微谓。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工森篷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豺型。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓仲智,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姻氨。 傳聞我的和親對象是個殘疾皇子钓辆,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容