练习:编写一个程序,将浮点数转换成人民币读法字符串(详细注释)

用java编写一个程序,将浮点数转换成人民币读法字符串,例如将1006.333转换成壹仟零陆元叁角叁分
(详细注释,学习中,有错误可以指出。)

//编写一个程序,将浮点数转换成人民币读法字符串,例如将1006.333转换成壹仟零陆元叁角叁分。

public class demotwo {
    //首先,设置三个字符型数组,由于只用于该方法中,所以定义时采用私有
    private String[] hanArr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    private String[] unitArr ={"仟", "", "拾", "佰"};
    private String[] tag = {"元","万","亿"};

    //通用数组设置完成,现在进行转换方法的编写
    public String toHanStr(double num){
        //设置一个最后输出的字符型变量,result,最后返回这个值
        String result = "";   //会返回一个String类型的值,被result接收。

        //第一步,将设置的数字的整数部分与小数部分分开。
        long zheng = (long) num;
        long xiao = (long)((num-zheng)*100);
        //第二步,把整数值转换成字符串赋给zhengStr,再把len设置成字符串的长度,用来控制遍历
        String zhengStr = String.valueOf(zheng);
        int len = zhengStr.length();

        int tempLen = 0;

        //第三步,控制整数部分转换输出
            //首先,用for循环控制对整数部分的遍历
        for (int i = 0; i <len ; i++) {
            //然后将该位置的字符型数字转换成int型数字,由于字符型数字与int型数字之间相差48,所以设置temp来存放整型数字
            int temp = zhengStr.charAt(i) - 48;
            //然后确定该数字在哪一个段,并且存放在int型变量part中,段包括元段,万段,亿段
            int part = (len - i - 1) / 4;
            //然后确定该数字在该段的哪一个位置,并且存放在int型变量location中,位置包括,仟、佰,拾,“ ”
            int location = (len - i - 1) % 4;

            //需要该判断数字是在个位上还是其他位上,由此确定后面需不需要加单位,因为只有十位百位千位上要加仟佰拾。
            //也就是判断表示位置的location是否等于0

            //首先处理不是最后一位的情况
            if(location!=0){
                //判断完位置之后,还需要判断该位置上是否为0,由于不在最后一位上,所以如果该位置是0的话,要加上“零”

                //不等于零的情况
                if(temp!=0){
                    result += hanArr[temp] + unitArr[(len - i) % 4];  //用result存放数字加单位, 例如 壹+仟  壹仟
                    continue; //跳出
                }
                //等于0的情况
                else{
                    tempLen = result.length();
                    //等于0的情况,要是处于哪一个位置的0,现在已经排除了是最后一位的情况
                    //假设设置的数字只有四位,也就是“x”仟“x”佰“x”拾“x”
                    //如果第一位为0的话,那就需要直接跳过仟,而第二与第三位位是0的话,那就需要加个零,去掉后面的单位
                    if(3 == location) { //当前字符为该段第一个
                        result += "零"; continue;
                    } else {
                        tempLen = result.length();
                        //然后判断该位置前一个位置是否为零,如果前一个位置也是零的话,那么这里就不需要加零了。例如1001,中间读出来只有一个零
                        if(result.charAt(tempLen - 1) == '零') {
                            continue;
                        }
                        //如果前一个位置的字符不是零,那就得加上零了
                        else {
                            result += "零"; continue;
                        }
                    }

                }
            }
            //然后处理是最后一位的情况,是最后一位的话则要判断要加上什么单位,元万亿
            else {
                //temp就是需要判断的Int型数字,虽然确认了是最后一位,但还是需要判断这个数是否为0
                // 如果是0的话就直接加单位
                //如果不是0的话,就直接把之前设置的两个数组连接在一起,即hanArr和tag,数值和单位,即伍元,伍万,伍亿
                if(temp != 0) {
                    result += hanArr[temp] + tag[part]; continue;
                }
                else
                {
                    //当temp为零的时候,还要判断前一位是否为零,例如1100与1110,读法为壹仟一百元,和壹仟壹佰壹拾元
                    tempLen = result.length();
                    if(result.charAt(tempLen - 1) != '零') {
                        //当前一位不等于零时,直接用这个数字加上单位即可,例如壹拾()元,中间括号就是因为这个数为零,所以直接加上元的单位,然后跳出循环了
                        result += tag[part]; continue;
                    }
                    else {
                        //判断完最后一位不为零之后,则要判断前面的三位是否都为零,这样的情况只需要直接跳过就好了
                        //例如1、0000、0000
                        //由于遍历的顺序,这里我们先以万位为例,如果前面三位都是零,那么自然就是以壹亿零和壹万零结尾
                        //只要判断charAt(1)是否为亿或者万就好了,如果是亿或者万直接跳出
                        //这里会产生一个遗留问题,也就是像1、0000、0000这种的到最后都还是  壹亿零注意是壹亿零,并没有加上单位,所以零依旧是最后一位数
                        //多出了一个零,这个遗留问题会在小数的转换中解决
                        if(result.charAt(tempLen - 2) == '亿' || result.charAt(tempLen - 2) == '万') {
                            continue;
                        }
                        /*如果前一位为零的话,那么则需要判断了,由于前一位是十位,十万位,如果是零的话,那么前面就肯定已经判断过了
                        如果十万位,十位是零的话
                        之前就会判断百万位和百位上是否为零,如果这里也是零,那么十万位和十位上就不会进行判断
                        返回的result依旧只有一个零,这里我以1000、0000为例,因为这里判断的是最后一位,也就是万位上的数字
                        会判断十万位上是不是零,而十万位上不是零的话,就会进行上面的循环,这里的else已经确定十万位上是零了
                        按设置的方法倒推,由于十万位上是零,程序自然会判断百万位上是否为零(倒推)
                        现在我们正推来看,首先是 i=0时 result=壹仟   (千万位)
                        i=1时,result=壹仟零       (百万位)由于前一位不是零,所以直接加上了一个零
                        i=2时,result=壹仟零       (十万位)由于前一位是零,所以这里不加任何东西,直接跳出循环
                        好了,现在就到了我们判断的最后一位了,也就是万位
                        由于前面已经判断过了前一位为零,所以无论如何,result所储存的字符串中最后一个字符一定为零
                        所以这个时候就需要把那个零删掉然后加上单位了
                        例如            壹仟零——壹仟(零)万
                         */
                        else {
                            result = result.substring(0, tempLen - 1) + tag[part]; continue;
                            /*
                            substring(beginIndex ,endIndex )
                            beginIndex - 开始处的索引(包括)。
                            endIndex - 结束处的索引(不包括)。
                            例如前面是陆佰零,由于最后一位也是零,且需要取单位万,不可能念成陆佰零万,所以这个时候需要去掉字符串中的零
                            于是使用这个方法,直接忽略了该字符串的最后一个字符,也就是零,直接加上标签单位。
                             */
                        }
                    }
                }
            }
        }

        //处理完整数的转换,现在我们来进行小数的转换
        //由于小数单位比较少,所以我们并不需要单独设置一个字符型数组
        //这里我们先将小数中的角和分所代表的的数字单独提取出来
        int jiao = (int)(xiao / 10);
        int fen = (int)(xiao % 10);

        //然后判断角和分中是否为零的情况
        //而小数中,如果为零的话,那就直接跳过就好了,例如1.01读作壹元壹分,1.10读作壹元壹角
        if(jiao != 0) {
            result += hanArr[jiao] + "角";
        }
        if(fen != 0) {
            result += hanArr[fen] + "分";
        }

        //处理完小数之后开始处理遗留问题
        tempLen = result.length();
        //如果最后一位零,也就是壹仟万零,壹亿零这种情况,直接删掉最后一个零
        //然后按顺序进行下面的if语句
        //例如壹亿零变成壹亿,然后再由下面的循环变成壹亿元整
        if(result.charAt(tempLen - 1) == '零') {
            result = result.substring(0, tempLen - 1);
        }

        tempLen = result.length();
        //如果最后一位为元,也就是壹仟零壹元这种情况,再加上一个整
        if(result.charAt(tempLen - 1) == '元') {
            result += "整";
        }
        //如果最后一位为万/亿,也就是壹仟万,壹仟亿这种情况,再加上一个元整
        if(result.charAt(tempLen - 1) == '万' || result.charAt(tempLen - 1) == '亿') {
            result += "元整";
        }

        //最后输出!!!
        return result;
    }

    public static void main(String[] args) {
        demoone ntr = new demoone();    //实例化对象,前面是定义一个对象,后面是为这个对象分配内存空间,初始化对象
        System.out.println(ntr.toHanStr(600100.11));
    }
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个可能的实现: ```python def number_to_chinese(num): # 数字到中文的映射 chinese_num = { 0: '零', 1: '壹', 2: '贰', 3: '叁', 4: '肆', 5: '伍', 6: '陆', 7: '柒', 8: '捌', 9: '玖' } # 单位到中文的映射 chinese_unit = { 0: '', 1: '拾', 2: '佰', 3: '仟', 4: '万', 8: '亿' } # 将浮点数分成整数和小数两部分 integer_part, decimal_part = str(num).split('.') integer_part = int(integer_part) # 将整数部分转换成中文 integer_str = str(integer_part) integer_len = len(integer_str) chinese_str = '' zero_flag = False # 是否需要在连续的零后面添加一个零 for i, digit in enumerate(integer_str): # 处理整数位上的数字 chinese_str += chinese_num[int(digit)] # 添加数字对应的单位 if (integer_len - i - 1) in chinese_unit: chinese_str += chinese_unit[integer_len - i - 1] # 添加万和亿的单位 if (integer_len - i - 1) % 4 == 0: chinese_str += chinese_unit[integer_len - i - 1] # 处理连续的零 if digit == '0': zero_flag = True else: if zero_flag: chinese_str += chinese_num[0] zero_flag = False # 处理小数部分 if decimal_part: chinese_str += '点' for digit in decimal_part: chinese_str += chinese_num[int(digit)] return chinese_str + '元' def currency_to_chinese(num): # 将浮点数转换成字符串形式 num_str = '%.2f' % num # 处理负数 if num_str[0] == '-': return '负' + currency_to_chinese(abs(num)) # 处理整数和小数部分 integer_part, decimal_part = num_str.split('.') # 处理整数部分 chinese_str = number_to_chinese(integer_part) # 处理小数部分 if decimal_part == '00': chinese_str += '整' else: chinese_str += number_to_chinese(decimal_part) + '分' return chinese_str print(currency_to_chinese(123456789.99)) # 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元玖角玖分 print(currency_to_chinese(-123.45)) # 负壹佰贰拾叁元肆角伍分 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值