数字转金额问题(java)

目前只做到能够处理正整数的情况。负数和带小数的情况后续补充。
转载请注明出处http://www.cnblogs.com/johngerwang/p/5140881.html

package com.wang.money;

public class MoneyFormat {

static String chinese[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

static String unit[] = { "元","拾", "佰", "仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟","万"};

public static void main(String[] args) {
    public static void main(String[] args) {
    String[] money = { "1", "10", "100", "101", "1101", "1000", "1001", "11001", "11011", "11111", "10001",
            "101001", "100101", "1000101", "1000101", "10000101", "100000101" };
    for (int i = 0; i < money.length; i++) {
        convert(money[i]);
    }
}

public static void convert(String money) {
    String result = "";
    int index = 0;
    for (int i = money.length() - 1; i >= 0; i--) {
        //字符0的ascii码是48。
        result = chinese[money.charAt(i) - 48] + unit[index++] + result;
    }
    result = adjustZero(result);
    System.out.println(result);
}

public static String adjustZero(String money) {
    //下面3句是最特殊的,不需要补零的场景,所以先处理。
    //一百亿1000 0000 0000 /一切亿10000 0000 0000 的情况:不要写成零亿,所以以(零佰)*零拾零亿作为正则表达式。
    money = money.replace("(零佰)*零拾零亿", "亿");
    //一百万1000 0000 /一千万10000 0000 的情况:(零佰)*零拾零亿,不要写成零万,所以以(零佰)*零拾零万作为正则表达式。
    money = money.replace("(零佰)*零拾零万", "万");
    //一千1000/一百100,不要写成零元,所以以"(零佰)*零拾零元"作为正则表达式。
    money = money.replace("(零佰)*零拾零元", "元");
    //下面3句,因为在元,万,亿级别上都会存在,拾百千,所以优先处理。
    //如果是千位上是0,则转成零
    money = money.replaceAll("零+仟", "零");
    //如果是百位上是0,则转成零。为什么需要+,原因是因为可能上一句千位上的转换带来了一个零。
    money = money.replaceAll("零+佰", "零");
    //如果是十位上是0,则转成零。为什么需要+,原因是因为可能上一句佰位上的转换带来了一个零。
    money = money.replaceAll("零+拾", "零");
    //经过上面的转换,可能存在零+亿的情况,所以,需要处理。
    money = money.replaceAll("零+亿", "亿");
    //经过上面的转换,可能存在零+万的情况,所以,需要处理。
    money = money.replaceAll("零+万", "万");
    //经过上面的转换,可能存在零+元的情况,所以,需要处理。
    money = money.replaceAll("零+元", "元");
    //经过上面的转换,只剩下1001这种情况了,所以处理成一个零。
    money = money.replaceAll("零+", "零");
    //money = money.replaceAll("零+万", "万")处会出现一个异常情况就是万级别上全是0,而亿级别却有数据,那么万也不需要。
    money = money.replace("亿万", "亿");
    return money;
    }
}

结果如下:
壹元
壹拾元
壹佰元
壹佰零壹元
壹仟壹佰零壹元
壹仟元
壹仟零壹元
壹万壹仟零壹元
壹万壹仟零壹拾壹元
壹万壹仟壹佰壹拾壹元
壹万零壹元
壹拾万壹仟零壹元
壹拾万零壹佰零壹元
壹佰万零壹佰零壹元
壹佰万零壹佰零壹元
壹仟万零壹佰零壹元
壹亿零壹佰零壹元

posted on 2016-01-18 23:57  johngerwang 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/johngerwang/p/5140881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值