金额转换

本文介绍了如何将阿拉伯数字格式的金额转换为中国传统形式,例如将1011转换为壹仟零壹拾壹元整。文章通过具体的测试实例,如1011.11、101.1、101等,展示了转换过程,并考虑了数字长度较长的情况。提供了一段代码实现这一转换功能。
摘要由CSDN通过智能技术生成

阿拉伯数字金额转换成中国传统形式如:

(¥1011) ->(壹仟零壹拾壹元整)

考虑的方面很多,给出特定的测试实例:

  • 1011.11
  • 1011.1
  • 101
  • 10000001
  • 1001111

还有数字过长的情况,等等
代码如下所示:

public class MoneyTransfer 
{
    private static String[] base = {"个","拾","佰","仟"};
    private static String[] base2 = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
    private static String[] base3 = {"元","万","亿"};

    /**
     * 缺少异常处理
     * @param s转换的字符
     * @return
     */
    public String transfer(String s)
    {
        StringBuilder sb = new StringBuilder();
        //去掉开头的Y
        String sub = s.substring(1,s.length());


        int subLength = sub.length();
        //判断是否有小数
        System.out.println(sub.contains("."));
        if(sub.contains("."))
        {
            //获取小数点的位置
            int index = sub.indexOf(".");
            System.out.println(index);
            //获取前半部分的读法
            String back1 = readInt(sub.substring(0,index));

            sb.append(back1);
            sb.append("元");
            if(index + 1 < subLength)
            {
                int tem = sub.charAt(index + 1) -'0';
                sb.append(base2[tem]);
                sb.append("角");
            }
            if(index + 2 < subLength)
            {
                int tem2 = sub.charAt(index + 2) - '0';
                sb.append(base2[tem2]);
                sb.append("分");
            }

            return sb.toString();

        }
        else
        {
            String back = readInt(sub);
            sb.append(back);
            sb.append("元整");
            return sb.toString();
        }
    }

    /**
     * 把整数部分读取
     * @param s
     * @return
     */
    public String readInt(String s)
    {
        StringBuilder sbr = new StringBuilder();
        int len = s.length();
        int flag = len / 4;
        int flag_t = flag;
        int over = len % 4;
        int overflow = over;
        int begin = 0;
        while(overflow <= len)
        {

            while(begin < overflow && begin < len)
            {
                int i = s.charAt(begin) - '0';
                int sbrlen = sbr.length();
                int tag = overflow - begin - 1;
                //不为0的情况,直接填写
                if(i != 0)
                {
                    //将上一部中遗留的0去掉
                    if(sbrlen > 0 && overflow - begin == 4 && sbr.substring(sbrlen - 1, sbrlen).equals("零"))
                    {
                        sbr.delete(sbrlen - 1, sbrlen);
                        sbr.append(base2[i]);
                        if(tag > 0)
                            sbr.append(base[tag]);
                    }
                    else
                    {
                        sbr.append(base2[i]);
                        if(tag > 0)
                            sbr.append(base[tag]);
                        if(begin + 1 == overflow)
                            if(flag > 1)
                                if(flag_t > 0)
                                    sbr.append(base3[flag_t]);
                            else if(flag == 1)
                                if(over != 0)
                                    sbr.append(base3[flag_t]);
                    }
                }
                //开头为 0 的情况
                else
                {
                    //当前面为0if(sbrlen > 0 && sbr.substring(sbrlen - 1, sbrlen).equals("零") )
                    {
                        //是不是最后一位
                        if(begin + 1 == overflow)
                        {
                            sbr.delete(sbrlen - 1, sbrlen);
                            if(over != 0 && flag_t > 0)
                                sbr.append(base3[flag_t]);
                            sbr.append("零");
                        }
                    }
                    //当前面不为0else
                    {
                        if(begin + 1 == overflow)
                        {
                            if(over != 0 && flag > 0)
                                sbr.append(base3[flag]);
                            sbr.append("零");
                        }
                        else
                            sbr.append("零");

                    }
                }


                begin ++;

            }


            flag_t--;
            overflow += 4;

        }
        if(sbr.substring(sbr.length() - 1, sbr.length()).equals("零"))
            sbr.delete(sbr.length() - 1, sbr.length());
        return sbr.toString();

    }


    public static void main(String[] args)
    {
        MoneyTransfer mt = new MoneyTransfer();
        System.out.print(mt.transfer("¥111111111111.11"));

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值