溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用Java完成人民幣大寫轉(zhuǎn)化

發(fā)布時間:2021-04-23 15:19:45 來源:億速云 閱讀:325 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)如何使用Java完成人民幣大寫轉(zhuǎn)化的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

Java有哪些集合類

Java中的集合主要分為四類:1、List列表:有序的,可重復(fù)的;2、Queue隊列:有序,可重復(fù)的;3、Set集合:不可重復(fù);4、Map映射:無序,鍵唯一,值不唯一。

一、前言

人民幣大寫金額的正確寫法:

整數(shù)部分:零、壹、貳、叁、肆、伍、陸、柒、捌、玖

小數(shù)部分:角、分、厘

數(shù)位部分:拾、佰、仟、萬、億、元

二、注意

阿拉伯數(shù)字小寫金額數(shù)字中有 “0” 時,中文大寫應(yīng)按照漢語語言規(guī)律、金額數(shù)字構(gòu)成和防止涂改的要求進行書寫。舉例如下:

1、阿拉伯數(shù)字中間有 “0” 時,中文大寫要寫“零”字,如¥1409.50應(yīng)寫成人民幣壹仟肆佰零玖元伍角。

2、阿拉伯數(shù)字中間連續(xù)有幾個 “0” 時、中文大寫金額中間可以只寫一個“零”字,如¥6007.14應(yīng)寫成人民幣陸仟零柒元壹角肆分。

3、阿拉伯金額數(shù)字萬位和元位是 “0” ,或者數(shù)字中間連續(xù)有幾個 “0” ,萬位、元位也是 “0” 但千位、角位不是 “0” 時,中文大寫金額中可以只寫一個零字,也可以不寫“零”字,
如¥1680.32應(yīng)寫成人民幣壹仟陸佰捌拾元零叁角貳分,或者寫成人民幣壹仟陸佰捌拾元叁角貳分。又如¥107000.53應(yīng)寫成人民幣壹拾萬柒仟元零伍角叁分,或者寫成人民幣壹拾萬零柒仟元伍角叁分。

4、阿拉伯金額數(shù)字角位是 “0” 而分位不是 “0” 時,中文大寫金額“元”后面應(yīng)寫“零”字,如¥16409.02應(yīng)寫成人民幣壹萬陸仟肆佰零玖元零貳分,又如¥325.04應(yīng)寫成人民幣叁佰貳拾伍元零肆分。

三、思路分析

  • 初始化人民幣大寫金額,其中數(shù)位的順序是有要求的。

  • 對傳入的字符串進行校驗(非空、特殊字符)

  • 判斷字符串的長度是否超過了轉(zhuǎn)換范圍

  • 判斷是否存在負數(shù),對負號進行替換

  • 分離整數(shù)部分和小數(shù)部分

  • 判斷整數(shù)部分是否已經(jīng)達到萬

這里使用到了一個StringUtils類和單元測,junit,需要導(dǎo)入依賴

<dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

四、完整代碼

public class ConvertUpMoney {
    //整數(shù)部分的人民幣大寫
    private static final String[] NUMBERS = {"零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"};
    //數(shù)位部分
    private static final String[] IUNIT = {"元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟", "萬", "拾", "佰", "仟"};
    //小數(shù)部分的人民幣大寫
    private static final String[] DUNIT = {"角", "分", "厘"};

    //轉(zhuǎn)成中文的大寫金額
    public static String toChinese(String str) {
        //判斷輸入的金額字符串是否符合要求
        if (StringUtils.isBlank(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) {
            System.out.println("抱歉,請輸入數(shù)字!");
            return str;
        }
        //判斷輸入的金額字符串
        if ("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) {
            return "零元";
        }

        //判斷是否存在負號"-"
        boolean flag = false;
        if (str.startsWith("-")) {
            flag = true;
            str = str.replaceAll("-", "");
        }
        //如果輸入字符串中包含逗號,替換為 "." 
        str = str.replaceAll(",", ".");

        String integerStr;//整數(shù)部分數(shù)字
        String decimalStr;//小數(shù)部分數(shù)字


        //分離整數(shù)部分和小數(shù)部分
        if (str.indexOf(".") > 0) {//整數(shù)部分和小數(shù)部分
            integerStr = str.substring(0, str.indexOf("."));
            decimalStr = str.substring(str.indexOf(".") + 1);
        } else if (str.indexOf(".") == 0) {//只存在小數(shù)部分 .34
            integerStr = "";
            decimalStr = str.substring(1);
        } else { //只存在整數(shù)部分 34
            integerStr = str;
            decimalStr = "";
        }

        //整數(shù)部分超出計算能力,直接返回
        if (integerStr.length() > IUNIT.length) {
            System.out.println(str + ":超出計算能力");
            return str;
        }

        //整數(shù)部分存入數(shù)組  目的是為了可以動態(tài)的在字符串數(shù)組中取對應(yīng)的值
        int[] integers = toIntArray(integerStr);

        //判斷整數(shù)部分是否存在輸入012的情況
        if (integers.length > 1 && integers[0] == 0) {
            System.out.println("抱歉,請輸入數(shù)字!");
            if (flag) {
                str = "-" + str;
            }
            return str;
        }
        boolean isWan = isWanUnits(integerStr);//設(shè)置萬單位

        //小數(shù)部分數(shù)字存入數(shù)組
        int[] decimals = toIntArray(decimalStr);

        String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);//返回最終的大寫金額

        if (flag) {
            return "負" + result;//如果是負數(shù),加上"負"
        } else {
            return result;
        }
    }

    //將字符串轉(zhuǎn)為int數(shù)組
    private static int[] toIntArray(String number) {
        //初始化一維數(shù)組長度
        int[] array = new int[number.length()];
        //循環(huán)遍歷賦值
        for (int i = 0; i < number.length(); i++) {
            array[i] = Integer.parseInt(number.substring(i, i + 1));
        }
        return array;
    }

    //將整數(shù)部分轉(zhuǎn)為大寫的金額
    public static String getChineseInteger(int[] integers, boolean isWan) {
        StringBuffer chineseInteger = new StringBuffer("");
        int length = integers.length;
        // 對于輸入的字符串為 "0." 存入數(shù)組后為 0
        if (length == 1 && integers[0] == 0) {
            return "";
        }
        for (int i = 0; i < length; i++) {
            String key = "";//0325464646464
            if (integers[i] == 0) {
                if ((length - i) == 13)//萬(億)
                    key = IUNIT[4];
                else if ((length - i) == 9) {//億
                    key = IUNIT[8];
                } else if ((length - i) == 5 && isWan) {//萬
                    key = IUNIT[4];
                } else if ((length - i) == 1) {//元
                    key = IUNIT[0];
                }
                if ((length - i) > 1 && integers[i + 1] != 0) {
                    key += NUMBERS[0];
                }
            }
            chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1]));
        }
        return chineseInteger.toString();
    }

    //將小數(shù)部分轉(zhuǎn)為大寫的金額
    private static String getChineseDecimal(int[] decimals) { //角 分 厘   038  壹分捌厘
        StringBuffer chineseDecimal = new StringBuffer("");
        for (int i = 0; i < decimals.length; i++) {
            if (i == 3) {
                break;
            }
            chineseDecimal.append(decimals[i] == 0 ? "" : (NUMBERS[decimals[i]] + DUNIT[i]));
        }
        return chineseDecimal.toString();
    }

    //判斷當前整數(shù)部分是否已經(jīng)是達到【萬】
    private static boolean isWanUnits(String integerStr) {
        int length = integerStr.length();
        if (length > 4) {
            String subInteger = "";
            if (length > 8) {
                subInteger = integerStr.substring(length - 8, length - 4);
            } else {
                subInteger = integerStr.substring(0, length - 4);
            }
            return Integer.parseInt(subInteger) > 0;
        } else {
            return false;
        }
    }

五、代碼測試

  • 阿拉伯數(shù)字中包含 "0"的測試

  • 特殊情況的測試(特殊字符、負數(shù)、超過人民幣數(shù)值范圍)。

@Test
    public void test() {
        String number = "1409.50";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹仟肆佰零玖元伍角
    }
    @Test
    public void test2() {
        String number = "6007.14";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//陸仟零柒元壹角肆分
    }
    @Test
    public void test3() {
        String number = "1680.32";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹仟陸佰捌拾元叁角貳分
    }
    @Test
    public void test4() {
        String number = "107000.53";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹拾萬零柒仟元伍角叁分
    }
    @Test
    public void test5() {
        String number = "16409.02";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//壹萬陸仟肆佰零玖元零貳分
    }
    @Test
    public void test6() {
        String number = "325.04";
        String afterStr = ConvertUpMoney.toChinese(number);
        System.out.println(number + ": " + afterStr);//叁佰貳拾伍元零肆分
    }

    @Test
    public void test7() {
        String number = "-0325.04";
        String afterStr = ConvertUpMoney.toChinese(number);//抱歉,請輸入數(shù)字!
        System.out.println(number + ": " + afterStr);
    }

    @Test
    public void test8() {
        String number = "325#sdr";
        String afterStr = ConvertUpMoney.toChinese(number);//抱歉,請輸入數(shù)字!
        System.out.println(number + ": " + afterStr);//325#sdr: 325#sdr
    }

    @Test
    public void test9() {
        String number = "-34327987";
        String afterStr = ConvertUpMoney.toChinese(number);//-34327987: 負叁仟肆佰叁拾貳萬柒仟玖佰捌拾柒元
        System.out.println(number + ": " + afterStr);
    }

    @Test
    public void test10() {
        String number = "78934029675923532";
        System.out.println("長度 :" + number.length());//長度 :17
        String afterStr = ConvertUpMoney.toChinese(number);//78934029675923532:超出計算能力
        System.out.println(number + ": " + afterStr);
    }

圖解轉(zhuǎn)換的過程:

如何使用Java完成人民幣大寫轉(zhuǎn)化

整數(shù)部分轉(zhuǎn)化人民幣大寫方法簡寫

如何使用Java完成人民幣大寫轉(zhuǎn)化

小數(shù)部分轉(zhuǎn)換人民幣大寫方法簡寫

如何使用Java完成人民幣大寫轉(zhuǎn)化

轉(zhuǎn)換過程:

如何使用Java完成人民幣大寫轉(zhuǎn)化

轉(zhuǎn)換結(jié)果:

貳拾叁億貳仟柒佰捌拾玖萬叁仟肆佰壹拾玖元

感謝各位的閱讀!關(guān)于“如何使用Java完成人民幣大寫轉(zhuǎn)化”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI