public class MoneyChange {

    public static void main(String[] args) {
        System.out.println(change(1001011));
    }

    /**
     * 将阿拉伯金钱表示转换成中国传统表现形式
     *
     * @param d 传入一个double类型的数值
     *         
     * @return 返回一个中国传统钱币表现形式的字符串
     */
    public static String change(double d) {
        // 要使用查表法,所以先定义每位上数字对应的中文大写和每位处的单位
        // 由于中国人读数字的习惯是4位一节(几千几百几十几),后面再跟上 万,亿等单位所以
        // 在写单位表时玩后面用拾佰千, 在这里最好是定义成字符串类型数字,这样可以减少下面代码的转换步骤
        String[] hanArr = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
        String[] unitArr = { "分", "角", "元", "拾", "佰", "千", "万", "拾", "佰", "千",
                "亿" };
        // 由于要精确到分,所以把原数乘以100舍掉小数点两位以后的数字转换成long类型
        // 如果转换成int类型则数据在大概佰万处就会出错,因为int只有4个字节而double有8个字节
        // 需要将其强转成同样是8个字节的long类型,这样才能保证数据不丢失。
        // 另外需要注意所输入数字的范围因为我们把小数点向右移动了两位,输入100我们处理后就变成了10000
        long zheng = (long) (d * 100);
        String str = String.valueOf(zheng);
        // 将字符串转化成字符数组 。此处也可以通过遍历将字符串转换成int[]这样就可以避免了后面的强转避开了一些容易忽略的地方
        //int[] it = new int[str.length()];
        // for(int i = 0;i<str.length;i++){
        // it[i]=(Integer.parseInt)(str[i]);
        // }
        char[] chr = str.toCharArray();
        String ss = "";
        for (int i = 0; i < chr.length; i++) {
            // 将字符数组中的元素强转成int类型,因为他们的ASCii码值相差48所以要减去48,例如1在ASCii中对应的值是49
            // 这一点一下子不太容易想到、容易忽略
            int x = (int) chr[i] - 48;
            // zheng的第i位对应unitArr中的索引为chr.length - i - 1个元素
            int y = chr.length - i - 1;
            ss += hanArr[x] + unitArr[y];
        }
        // 使用字符串的replaceAll方法结合正则表达式来将字符串转化成为符合中国人阅读习惯的字符串
        return ss.replaceAll("零[拾佰千]", "零").replaceAll("零+万", "万")
                .replaceAll("零+元", "元").replaceAll("零+角", "")
                .replaceAll("零+分", "").replaceAll("零+", "零");

        // return ss; 不能直接returnss,因为使用字符串的replaceAll方法返回的是
        // 一个新的字符串而原来的字符串ss并没有改变
    }
}