最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA數(shù)字轉(zhuǎn)中文大寫兩種實(shí)現(xiàn)代碼

 更新時間:2025年07月02日 08:58:28   作者:叩叮ING  
在Java程序?qū)崿F(xiàn)數(shù)字金額轉(zhuǎn)為大寫中文金額,是一項非常常見的編程任務(wù),這篇文章主要介紹了JAVA數(shù)字轉(zhuǎn)中文大寫兩種實(shí)現(xiàn)方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下,

一般在收據(jù)打印過程中,可能會要求展示中文大寫金額,以下提供兩種實(shí)現(xiàn)。

1正常代碼邏輯處理

優(yōu)點(diǎn):易理解,好維護(hù)

缺點(diǎn):代碼較長

package com.test;

import java.math.BigDecimal;

public class NumberToChinese {
    private static final String[] NUMBERS = {"零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"};
    private static final String[] UNITS = {"", "拾", "佰", "仟"};
    private static final String[] BIG_UNITS = {"", "萬", "億", "兆"};

    public static String numberToChinese(double number) {
        boolean isNegative = number < 0;
        number = Math.abs(number);

        BigDecimal bigDecimal = new BigDecimal(String.valueOf(number));
        long integerPart = bigDecimal.longValue();
        int decimalPart = (bigDecimal.subtract(new BigDecimal(integerPart)).multiply(new BigDecimal(100))).intValue();

        if (integerPart == 0 && decimalPart == 0) {
            return isNegative ? "負(fù)零元整" : "零元整";
        }

        StringBuilder result = new StringBuilder();
        int unitIndex = 0;
        boolean zeroFlag = false;
        while (integerPart > 0) {
            long group = integerPart % 10000;
            if (group != 0) {
                if (zeroFlag) {
                    result.insert(0, "零");
                }
                result.insert(0, BIG_UNITS[unitIndex]);
                result.insert(0, groupToChinese(group));
                zeroFlag = false;
            } else {
                zeroFlag = true;
            }
            integerPart /= 10000;
            unitIndex++;
        }

        // 去除多余的零
        while (result.length() > 0 && result.charAt(0) == '零') {
            result.deleteCharAt(0);
        }

        // 如果小數(shù)部分為 0,直接添加“元整”
        if (decimalPart == 0) {
            // 避免出現(xiàn)“零元整”情況,這里判斷結(jié)果最后是否是大單位,如果是直接加“整”
            if (result.length() > 0 && isBigUnit(result.charAt(result.length() - 1))) {
                result.append("整");
            } else if("零".equals(result.substring(result.length() - 1,result.length()))) {
                result.replace(result.length() - 1,result.length(),"").append("元整");
            }else{
                result.append("元整");
            }
        } else {
            result.append("元");
            String decimalStr = decimalToChinese(decimalPart);
            if (!decimalStr.isEmpty()) {
                result.append(decimalStr);
            }
        }


        if (isNegative) {
            result.insert(0, "負(fù)");
        }

        return result.toString();
    }

    private static String groupToChinese(long group) {
        StringBuilder groupResult = new StringBuilder();
        boolean zeroFlag = false;
        for (int i = 0; i < 4; i++) {
            int digit = (int) (group / (long) Math.pow(10, 3 - i) % 10);
            if (digit != 0) {
                if (zeroFlag) {
                    groupResult.append("零");
                }
                groupResult.append(NUMBERS[digit]).append(UNITS[3 - i]);
                zeroFlag = false;
            } else {
                zeroFlag = true;
            }
        }
        String result = groupResult.toString();
        if (result.endsWith("零")) {
            result = result.substring(0, result.length() - 1);
        }
        return result;
    }

    private static String decimalToChinese(int decimalPart) {
        StringBuilder decimalResult = new StringBuilder();
        int jiao = decimalPart / 10;
        int fen = decimalPart % 10;

        if (jiao != 0) {
            decimalResult.append(NUMBERS[jiao]).append("角");
        } else if (fen != 0) {
            decimalResult.append("零");
        }

        if (fen != 0) {
            decimalResult.append(NUMBERS[fen]).append("分");
        }

        return decimalResult.toString();
    }

    private static boolean isBigUnit(char c) {
        for (String unit : BIG_UNITS) {
            if (unit.length() > 0 && unit.charAt(0) == c) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        double positiveInteger = 510000.00;
        double positiveDecimal = 12345.67;
        double negativeInteger = -500000.00;
        double negativeDecimal = -12345.67;
        double zeroNumber = 0;
        double wan = 51111.00;

        String positiveIntegerChinese = numberToChinese(positiveInteger);
        String positiveDecimalChinese = numberToChinese(positiveDecimal);
        String negativeIntegerChinese = numberToChinese(negativeInteger);
        String negativeDecimalChinese = numberToChinese(negativeDecimal);
        String zeroChinese = numberToChinese(zeroNumber);
        String wanChinese = numberToChinese(wan);

        System.out.println("正整數(shù)金額轉(zhuǎn)換結(jié)果: " + positiveIntegerChinese);
        System.out.println("正小數(shù)金額轉(zhuǎn)換結(jié)果: " + positiveDecimalChinese);
        System.out.println("負(fù)整數(shù)金額轉(zhuǎn)換結(jié)果: " + negativeIntegerChinese);
        System.out.println("負(fù)小數(shù)金額轉(zhuǎn)換結(jié)果: " + negativeDecimalChinese);
        System.out.println("零金額轉(zhuǎn)換結(jié)果: " + zeroChinese);
        System.out.println("wan轉(zhuǎn)換結(jié)果: " + wanChinese);
    }
}

代碼方法作用解釋:

  • 常量定義

    • NUMBERS:存儲中文數(shù)字大寫字符。
    • UNITS:存儲整數(shù)部分每四位一組內(nèi)的單位(個、十、百、千)。
    • BIG_UNITS:存儲整數(shù)部分每四位一組的大單位(萬、億、兆)。
    • DECIMAL_UNIT:存儲小數(shù)部分的單位(角、分)。
  • numberToChinese 方法

    • 使用 BigDecimal 處理輸入的數(shù)字,避免浮點(diǎn)數(shù)精度問題。
    • 分離整數(shù)部分和小數(shù)部分。
    • 處理整數(shù)部分,按每四位一組進(jìn)行轉(zhuǎn)換,并添加大單位。
    • 處理小數(shù)部分,根據(jù)小數(shù)位的值添加對應(yīng)的中文大寫和單位。
  • groupToChinese 方法

    • 將每四位一組的數(shù)字轉(zhuǎn)換為中文大寫。
    • 處理連續(xù)零的情況,避免出現(xiàn)多余的零。

2使用正則

優(yōu)點(diǎn):代碼片段短

缺點(diǎn):使用了正則的貪婪符號,可能會造成代碼回溯情況,嚴(yán)重可造成阻斷風(fēng)險

關(guān)于正則常見貪婪字符,點(diǎn)擊查看

public static String digitUppercase(double n){
        String[] fraction = {"角", "分"};
        String[] digit = { "零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖" };
        String[][] unit = {
  
  {"元", "萬", "億"},
                {"", "拾", "佰", "仟"}};

        String head = n < 0? "負(fù)": "";
        n = Math.abs(n);

        String s = "";
        for (int i = 0; i < fraction.length; i++) {
            BigDecimal bd = BigDecimal.valueOf(n);
            bd = bd.setScale(2, bd.ROUND_HALF_EVEN);
            BigDecimal rs = bd.multiply(BigDecimal.valueOf(10)).multiply(BigDecimal.valueOf(Math.pow(10, i))).divideAndRemainder(new BigDecimal(10))[1];
            s+=(digit[(int)(Math.floor(rs.doubleValue()))]+ fraction[i]).replaceAll("(零.)+", "");
        }
        if(s.length()<1){
            s = "整";
        }
        int integerPart = (int)Math.floor(n);

        for (int i = 0; i < unit[0].length && integerPart > 0; i++) {
            String p ="";
            for (int j = 0; j < unit[1].length && n > 0; j++) {
                p = digit[integerPart%10]+unit[1][j] + p;
                integerPart = integerPart/10;
            }
            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
        }
        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
    }

總結(jié) 

到此這篇關(guān)于JAVA數(shù)字轉(zhuǎn)中文大寫兩種實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)JAVA數(shù)字轉(zhuǎn)中文大寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中Bean有關(guān)NullPointerException異常的原因分析

    Spring中Bean有關(guān)NullPointerException異常的原因分析

    在Spring中使用@Autowired注解注入的bean不能在靜態(tài)上下文中訪問,否則會導(dǎo)致NullPointerException,解決方法包括避免在靜態(tài)方法中使用注入的bean,或者使用Spring的ApplicationContext來獲取bean,但后者不推薦
    2024-12-12
  • Java全排列算法字典序下的下一個排列講解

    Java全排列算法字典序下的下一個排列講解

    今天小編就為大家分享一篇關(guān)于Java全排列字典序下的下一個排列,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • rocketmq如何修改存儲路徑

    rocketmq如何修改存儲路徑

    這篇文章主要介紹了rocketmq如何修改存儲路徑的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Win10 Java jdk14.0.2安裝及環(huán)境變量配置詳細(xì)教程

    Win10 Java jdk14.0.2安裝及環(huán)境變量配置詳細(xì)教程

    這篇文章主要介紹了Win10 Java jdk14.0.2安裝及環(huán)境變量配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 基于spring DI的三種注入方式分析

    基于spring DI的三種注入方式分析

    這篇文章主要介紹了基于spring DI的三種注入方式分析,具有很好的參考價值,希望對大家有所幫助。
    2021-07-07
  • Java 高并發(fā)七:并發(fā)設(shè)計模型詳解

    Java 高并發(fā)七:并發(fā)設(shè)計模型詳解

    本文主要介紹Java高并發(fā) 并發(fā)設(shè)計模型的知識,這里主要講解 1. 什么是設(shè)計模式 2. 單例模式 3. 不變模式 4. Future模式 5. 生產(chǎn)者消費(fèi)者,有需要的小伙伴可以參考下
    2016-09-09
  • java?jpa如何自定義sql語句

    java?jpa如何自定義sql語句

    這篇文章主要介紹了java?jpa如何自定義sql語句方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 關(guān)于SpringMVC對Restful風(fēng)格的支持詳解

    關(guān)于SpringMVC對Restful風(fēng)格的支持詳解

    Restful就是一個資源定位及資源操作的風(fēng)格,不是標(biāo)準(zhǔn)也不是協(xié)議,只是一種風(fēng)格,是對http協(xié)議的詮釋,下面這篇文章主要給大家介紹了關(guān)于SpringMVC對Restful風(fēng)格支持的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Spring?MVC和springboot靜態(tài)資源處理問題

    Spring?MVC和springboot靜態(tài)資源處理問題

    這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java枚舉轉(zhuǎn)list通用類過程

    java枚舉轉(zhuǎn)list通用類過程

    文章介紹了如何將Java枚舉類型轉(zhuǎn)換為List<Map<String, Object>>的通用類,該類可以實(shí)現(xiàn)枚舉到列表的轉(zhuǎn)換,并且示例了使用方法
    2025-03-03

最新評論

吴桥县| 苍梧县| 驻马店市| 洛阳市| 格尔木市| 彰武县| 三门县| 武冈市| 洪湖市| 江川县| 昂仁县| SHOW| 原阳县| 三亚市| 张掖市| 诸城市| 屯昌县| 广宗县| 中宁县| 龙门县| 榆中县| 隆子县| 太和县| 同德县| 巴塘县| 搜索| 德格县| 阿城市| 浦东新区| 会理县| 公主岭市| 泰和县| 城口县| 和硕县| 惠东县| 西峡县| 恩施市| 永昌县| 威信县| 丰都县| 广德县|