java实验——中文大写金额

该博客介绍了一个Java程序,用于将输入的double类型数值转换为中文大写的人民币格式。程序通过处理整数和小数部分,以及处理连续零的特殊情况,实现了从元到亿的金额转换。代码中使用了DecimalFormat进行格式化,并提供了详细的注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明RMB人民币类如下,实现其中的成员方法

题目分析:最重要的是考虑如何转换整数金额。首先找到小数点的位置,将金额分为小数和整数部分分别处理。对于整数部分按亿,万,千四位一分进行处理。目前转换范围还存在一定局限,还需继续改进。
代码给出详细注释:

import java.util.Scanner;
import java.text.DecimalFormat; //科学计数法的转换
public class RMB {

    static char[] ZhenShuDanWei = {'元', '拾', '佰', '仟', '万', '亿'}; //整数只处理到亿
    static char[] XiaoShuDanWei = {'角', '分'}; //小数只处理到分
    static char[] Shuzi = {'零', '壹', '贰', '叁', '肆', '伍' ,'陆', '柒', '捌' ,'玖'};
    
    public static String check(char[] money) //对于零的处理应该放在最后一次遇到
    {
        
        String ans = new String();
        int wet = money.length - 1;

        if(wet == 0 && money[0] == '0') //处理金额为小数的情况
        {
            ans += Shuzi[0];
        }
        else
        {
            int sign = 0;//标记是否遇到0
            for(int i = 0; i < money.length; i++)
            {
                if(sign == 0 && money[i] == '0') //第一次遇到了零
                {
                    sign = 1;
                }
                else if(sign == 1 && money[i] == '0') //在一连串的零后又遇到了零 
                {
                    if(i + 1 < money.length && money[i + 1] == '0') continue; //0的后面还是零且不在最后一位
                    else if(i + 1 < money.length && money[i + 1] != '0') ans += Shuzi[0]; //0的后面不是零且不在最后一位
                    else if(i == money.length - 1) continue; //到结尾还是零,无需处理
                }
                else if(sign == 1 && money[i] != '0') //在一连串的零后又遇到了非零数字
                {   sign = 0;
                    ans += Shuzi[Integer.valueOf(money[i]) - 48]; //千万注意Integer.valueOf(money[i])转换的是字符的ascll码值
                    if(i != wet) ans += ZhenShuDanWei[wet - i]; //不是最后一位才会加上单位
                }
                else if(sign == 0 && money[i] != '0') //之前一直没有遇到零
                {
                    ans += Shuzi[Integer.valueOf(money[i]) - 48];
                    if(i != wet) ans += ZhenShuDanWei[wet - i];
                }
            }
        }
        return ans;
    }

    public static String toString(double x)
    {
        DecimalFormat df = new DecimalFormat("###0.00");
        char[] money = df.format(x).toCharArray();  
        String Zhen = new String(), Xiao = new String();//答案字符串

        //记录一下java本身提供的数组复制方法
        //System.arraycopy(array, 0, array2, 0, array.length);
        //(被复制的数组,从几号下标开始复制,复制到哪个数组,复制到新数组第几号下标,复制长度)
        int index = 0; //小数点的位置
        for(int i = 0; i < money.length; i++) if(money[i] == '.') {index = i; break;} //获得小数点下标位置

        //将小数和整数分开处理,将整数分解成亿,万,千
        char[] ZhenShu = new char[index];
        System.arraycopy(money, 0, ZhenShu, 0, index); //获取整数金额 
        //System.out.println(ZhenShu);

        //还要修改
        int elength = 0, wlength = 0; //当存在亿位和万位时,记录其长度
        if(ZhenShu.length > 8) //亿 
        {
            char[] temp = new char[ZhenShu.length - 8];
            elength = ZhenShu.length - 8; //存在时记录亿位的长度
            for(int i = 0; i < ZhenShu.length - 8; i++) temp[i] = money[i];
            Zhen +=  check(temp);
            Zhen += ZhenShuDanWei[5];
        }
        if(ZhenShu.length > 4) //万
        {
            if(ZhenShu.length > 8) //存在亿
            {
                char[] temp = new char[4];
                wlength = 4; //存在时记录万位的长度
                for(int i = 0; i < 4; i++) temp[i] = money[elength + i];
                Zhen +=  check(temp);
                Zhen += ZhenShuDanWei[4];
            }
            else
            {
                char[] temp = new char[ZhenShu.length - 4];
                wlength = ZhenShu.length - 4; //存在时记录万位的长度
                for(int i = 0; i < ZhenShu.length - 4; i++) temp[i] = money[i];
                Zhen +=  check(temp);
                Zhen += ZhenShuDanWei[4];
            }
        }
         
        // 千
        if(ZhenShu.length > 4) //存在万
        {
            char[] temp = new char[4];
            for(int i = 0; i < 4; i++) temp[i] = money[elength + wlength + i];
            Zhen +=  check(temp);
            Zhen += ZhenShuDanWei[0];
        }
        else
        {
            char[] temp = new char[ZhenShu.length];
            for(int i = 0; i < ZhenShu.length; i++) temp[i] = money[i];
            Zhen +=  check(temp);
            Zhen += ZhenShuDanWei[0];
        }
        
        char[] XiaoShu = new char[money.length - index - 1];
        System.arraycopy(money, index + 1, XiaoShu, 0, money.length - index - 1); //获取小数金额
        //System.out.println(XiaoShu);

        int isDigit = ((XiaoShu.length == 2) && (XiaoShu[0] == '0') && (XiaoShu[1] == '0')) ? 1 : 0; //金额是否是整数
        if(isDigit == 1) //如果是整数
        {
            Zhen += '整';
            return Zhen;
        }
        //处理小数
        else
        {
            if(XiaoShu.length == 2 && XiaoShu[1] == '0') //只有一位
            {
                Xiao += Shuzi[Integer.valueOf(XiaoShu[0]) - 48];
                Xiao += XiaoShuDanWei[0];
            }
            else if(XiaoShu.length == 2 && XiaoShu[0] == '0') //两位,第一位为0
            {
                Xiao += Shuzi[Integer.valueOf(XiaoShu[1]) - 48];
                Xiao += XiaoShuDanWei[1];
            }
            else //两位,都有数字
            {
                Xiao += Shuzi[Integer.valueOf(XiaoShu[0]) - 48];
                Xiao += XiaoShuDanWei[0];
                Xiao += Shuzi[Integer.valueOf(XiaoShu[1]) - 48];
                Xiao += XiaoShuDanWei[1];
            }

        return Zhen + Xiao;
        }
    } 

    public static void main(String[] args)
    {
        Scanner get = new Scanner(System.in);
        System.out.print("请输入需要转换的金额:");
        double num = get.nextDouble();

        if(num == 0.0) System.out.println("零元整"); //处理特殊情况
        else System.out.println(RMB.toString(num));

        get.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值