把一个数字转换为人民币的表示方式是银行常用的业务。
把数字转换为人民币的大写表示方式的第一步就是要把数字拆分为整数部分和小数部分,因为整数部分和小数部分要分进行处理
/** * 把一个浮点数分解为小数部分和整数部分 * * @param num * 需要被分解的浮点数 * @return 整数部分、小数部分组成的字符串数组 */ private String[] divide(double num) { // 1.通过把double类型的数据转换为long类型,截取整数部分 long zheng = (long) num; // 2.原来的数据减去整数部分乘以100取整得到两位小数的整数表示 long xiao = Math.round((num - zheng) * 100); // 以下两种方式都可以把基本数据类型转换为字符串 return new String[] { "" + zheng, String.valueOf(xiao) }; }
对于整数部分与小数部分分别进行处理,小数部分比较简单,只需截断为两位数字,转换为几角几分。对于整数部分,处理较为复杂。中文人民币表示方法中,对整数部分处理是四位一节的,如果数字是1-4位,则在后面加单位“元”,出现在5-8位,则添加单位“万”,出现在9-12位,则添加单位“亿”。
这里补充下Math.round函数,将原来的数字进行四舍五入处理,即原数0.5向下取整。可以这么理解,取一个数近似整数,如果返回两个近似值一样的整数,则取大一点的那个。
接下来将一个四位的整数字符串转换位汉字读法的代码。
private String[] hanArr = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; private String[] unitArr = { "十", "百", "千" }; /** * 个、十、百、千位的字符串数据转换为汉字表示方法 * * @param numStr * 四位字符串数据 * @return 字符串汉字表示形式 */ private String toHanStr(String numStr) { String result = ""; int numLen = numStr.length(); // 依次遍历访问字符串numStr的每一个数字 for (int i = 0; i < numLen; i++) { // 使用String.charAt()方法截取字符串的每一位, // 并将截取的char类型数字转换为int类型的数字(比如'4'转换为4,它们ASCII码差48) int num = numStr.charAt(i) - 48; // 如果不是最后一位数字,且数字不是0,则需要添加单位"十"、"百"、"千" if (i != numLen - 1 && num != 0) { result += hanArr[num] + unitArr[numLen - 2 - i]; } // 否则不需要添加单位 else { result += hanArr[num]; } } return result; }
最后,给汉字字符串加上人民币的单位。
private String[] unitArr_z = { "角", "分", "元", "万", "亿" }; /** * 加上单位(角、分、元、万、亿),转换为人民币的表示方式 * * @param numStrs * 整数数组 * @return 人民币读法的整数 */ private String toRMBString(String[] numStrs) { String result = ""; for (int i = 0; i < numStrs.length; i++) { result += numStrs[i] + unitArr_z[4 - i]; } return result; }
这里还有很多问题没有考虑到,比如,如何拆分整数部分,如何根据整数部分的长度来匹配合适的单位(这里默认其长度固定,实际上,在银行收款账单的填写中,格式确实是固定的),负数情况,恰好为整数的情况。因此这个代码在后续仍然有可以迭代、完善的空间。