java将数字价格转换为中文大写代码示例(工具类)

 更新时间:2024年10月29日 10:17:49   作者:Jason_boy5  
这篇文章主要介绍了java将数字价格转换为中文大写的相关资料,在Java中实现将数字价格转换为中文大写需要将数字分解为各个部分(如个位、十位、百位等),并根据这些部分转换为对应的中文大写数字,需要的朋友可以参考下

在Java中,将数字价格转换为中文大写通常涉及几个步骤,包括将数字分解为各个部分(如个位、十位、百位等),然后根据这些部分转换为对应的中文大写数字,并添加适当的单位(如元、角、分)。

以下是一个示例方法,它接受一个BigDecimal类型的价格(单位为元,包含小数点后两位),并将其转换为中文大写形式:

import java.math.BigDecimal;

public class PriceConverter {

    private static final String[] CHINESE_NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    private static final String[] UNITS = {"", "拾", "佰", "仟"};
    private static final String[] BIG_UNITS = {"", "万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧", "正", "载", "极"}; // 根据需要可以增加更多大单位

    public static String convertToChinese(BigDecimal price) {
        if (price == null || price.compareTo(BigDecimal.ZERO) < 0) {
            throw new IllegalArgumentException("价格不能为空或小于0");
        }

        // 转换为字符串并截取小数点前后部分
        String priceStr = price.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString();
        String integerPart = priceStr.split("\\.")[0]; // 整数部分
        String decimalPart = priceStr.split("\\.")[1]; // 小数部分(角、分)

        // 处理整数部分
        String integerChinese = convertToChinesePart(integerPart, UNITS, BIG_UNITS);

        // 处理小数部分
        String decimalChinese = "";
        if (!"00".equals(decimalPart)) {
            decimalChinese = convertToDecimalChinese(decimalPart);
        }

        // 合并结果
        return integerChinese + "元" + decimalChinese;
    }

    private static String convertToChinesePart(String numberStr, String[] units, String[] bigUnits) {
        if ("0".equals(numberStr)) {
            return CHINESE_NUMBERS[0];
        }

        StringBuilder sb = new StringBuilder();
        int unitIndex = 0;
//        int zeroCount = 0;

        for (int i = numberStr.length() - 1; i >= 0; i--) {
            int digit = numberStr.charAt(i) - '0';
            String chineseDigit = CHINESE_NUMBERS[digit];

            if (digit == 0) {
//                zeroCount++;
                // 连续零的处理:只在非零数字后面、单位变化处或字符串开始处添加一个零
                if (sb.length() > 0 && (sb.charAt(sb.length() - 1) != CHINESE_NUMBERS[0].charAt(0) || unitIndex == 0 || i == 0)) {
                    sb.insert(0, chineseDigit);
                }
            } else {
                // 添加非零数字和对应单位
                sb.insert(0, chineseDigit + units[unitIndex]);
//                zeroCount = 0; // 重置连续零的计数
            }

            // 切换到下一个单位
            if (++unitIndex == units.length) {
                unitIndex = 0; // 循环使用单位数组
                if (sb.length() > 0 && i > 0) {
                    sb.insert(0, bigUnits[(numberStr.length()-i) / units.length]);
                }
            }
        }

        // 去除末尾可能多余的零
        while (sb.length() > 0 && sb.charAt(0) == CHINESE_NUMBERS[0].charAt(0)) {
            sb.deleteCharAt(0);
        }

        return sb.toString();
    }

    private static String convertToDecimalChinese(String decimalPart) {
        StringBuilder sb = new StringBuilder();
        if (decimalPart.charAt(0) != '0') {
            sb.append(CHINESE_NUMBERS[decimalPart.charAt(0) - '0']).append("角");
        }
        if (decimalPart.length() > 1 && decimalPart.charAt(1) != '0') {
            sb.append(CHINESE_NUMBERS[decimalPart.charAt(1) - '0']).append("分");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(convertToChinese(new BigDecimal("4545444444111141233123522212345.67"))); // 肆佰伍拾肆穰伍仟肆佰肆拾肆秭肆仟肆佰肆拾壹垓壹仟壹佰壹拾肆京壹仟贰佰叁拾叁兆壹仟贰佰叁拾伍亿贰仟贰佰贰拾壹万贰仟叁佰肆拾伍元陆角柒分
        System.out.println(convertToChinese(new BigDecimal("100.00"))); // 壹佰元
        System.out.println(convertToChinese(new BigDecimal("0.01"))); // 零元壹分
        System.out.println(convertToChinese(new BigDecimal("0.00"))); // 零元
    }
}

附:java将输入的数字金额转换为中文大写金额

将输入的数字字符串中的每一个数字字符转换为对应的中文大写,例如12345转换为壹贰叁肆伍,再将此中文大写和对应的单位进行字符串的拼接并一起输出

输出结果为:零佰零拾壹万贰仟叁佰肆拾伍元

package com.ithm.stringdemo;
import java.util.Scanner;
 
public class Demo1 {
    //获取每一个数字对应的中文大写
    public static String getCapitalNumber(int number){
        String []capitalnumber={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        return capitalnumber[number];
    }
    public static void main(String[] args) {
        //数组里面放入输入的金额的每一位数字
        int []sz=new int[7];
        Scanner sc=new Scanner(System.in);
        int money;
       while (true){
           System.out.print("请输入任意金额:");
           money=sc.nextInt();
           if(money>=0 ||money<=9999999) {
           break;
       }else {
               System.out.println("金额无效,请重新输入");
           }
       }
       String capmoney="";
       int i=0;
       while (true){
           int ge=money%10;
           sz[i++]=ge;
           money=money/10;
           if(money==0) break;
       }
       //获取大写数字的字符串
        String capitalnumber="";
        for (int j = 0; j < sz.length; j++) {
            capitalnumber=getCapitalNumber(sz[j]);
            capmoney=capitalnumber+capmoney;
        }
        //定义一个字符串数组存放单位
        String []arr={"佰","拾","万","仟","佰","拾","元"};
        //将大写数字和单位数组进行字符串的拼接
        String result="";
        for (int k = 0; k < capmoney.length(); k++) {
            char c=capmoney.charAt(k);
            result=result+c+arr[k];
        }
        System.out.println(result);
    }
}

总结 

到此这篇关于java将数字价格转换为中文大写的文章就介绍到这了,更多相关java数字价格转换中文大写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文秒懂idea的git插件跟翻译插件

    一文秒懂idea的git插件跟翻译插件

    idea之类的开发软件真的超级多的插件,今天给大家分享idea的git插件跟翻译插件,感兴趣的朋友跟随小编一起看看吧
    2021-04-04
  • Java面向对象关键字extends继承的深入讲解

    Java面向对象关键字extends继承的深入讲解

    继承就是使用已定义的类作为父类,新建一个类作为子类使用extends关键字继承这个类,这样就实现了继承关系,这篇文章主要给大家介绍了关于Java面向对象关键字extends继承的相关资料,需要的朋友可以参考下
    2021-08-08
  • SpringBoot3.2.2整合MyBatis Plus3.5.5的详细过程

    SpringBoot3.2.2整合MyBatis Plus3.5.5的详细过程

    这篇文章给大家介绍了SpringBoot3.2.2整合MyBatis Plus3.5.5的详细过程,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Java读取网络文件的实例代码

    Java读取网络文件的实例代码

    这篇文章主要介绍了Java读取网络文件的实例代码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • java 中线程等待与通知的实现

    java 中线程等待与通知的实现

    这篇文章主要介绍了java 中线程等待与通知的实现的相关资料,希望通过本文能帮助到大家,让大家掌握这样的功能,需要的朋友可以参考下
    2017-09-09
  • websocket在springboot+vue中的使用教程

    websocket在springboot+vue中的使用教程

    这篇文章主要介绍了websocket在springboot+vue中的使用教程,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Springboot整合quartz产生错误及解决方案

    Springboot整合quartz产生错误及解决方案

    这篇文章主要介绍了Springboot整合quartz产生错误及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • springboot获取profile的操作

    springboot获取profile的操作

    这篇文章主要介绍了springboot获取profile的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring Boot多个定时任务阻塞问题的解决方法

    Spring Boot多个定时任务阻塞问题的解决方法

    在日常的项目开发中,往往会涉及到一些需要做到定时执行的代码,下面这篇文章主要给大家介绍了关于Spring Boot多个定时任务阻塞问题的解决方法,需要的朋友可以参考下
    2022-01-01
  • spring cloud gateway整合sentinel实现网关限流

    spring cloud gateway整合sentinel实现网关限流

    这篇文章主要介绍了spring cloud gateway整合sentinel实现网关限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论