在这里,首先声明一点:以下算法处理的数值整数部分最多为12位(也就是最多可以读到“几千亿”,如果需要扩展"万亿",只需在此基础上做小的更改即可,原理是一样的'),同时,输入数值默认大于0。
首先,自已实现这个函数的大方面的思路是:首先把这个浮点数分成整数部分和小数部分。提取整数部分很容易,直接将这个浮点数强制类型转换成一个整数即可,这个整数就是浮点数的整数部分;再使用浮点数减去整数就可以得到这个浮点数的小数部分。
接下来,分开处理整数部分和小数部分。小数部分的处理很简单,直接将小数截断到保留2位数字,转换成几角几分的字符串即可:
例如:小数部分为0.783,截断后(关于这里是否四舍五入的问题,则可以看具体要求了,一点点的差别罢了)为0.78,直接将“7”、“8”转换成人民币读法,然后分别在后面加上“角”和“分”即可。
重点和难点在于整数部分,这部分处理则稍微复杂一点:比如整数部分长度不一的问题;加单位“亿、万”的问题;中间一个零的问题;最后一个零的问题;中间连续多个零的问题;末尾多个零的问题等等。但静下心来分析不难发现:中国的数字习惯是4位一节的,一个4位的数字可被转成几千几百几十几(在这里还是一般情况,未考虑0的情况,不急,后面慢慢解决,考虑的是大的方向),至于后面添加什么单位则不确定,如果这节4位数字出现在1~4位(但且从最低位开始算起),则后面添加单位元;如果这节4位数字出现在5~8位,则后面添加单位万;如果这节4位数字出现在9~12位,则后面添加单位亿;多于12位这里暂不考虑。
这里,设想已经输入一个浮点数,并且已成功地取得了它的整数部分(由于把该浮点数强制转换成long类型值作为整数部分后,浮点数最高位的0是自动消除的,所以整数部分的处理不必考虑最高位存在若干0的问题)和小数部分,并且均赋给了long类型的变量(这里先不考虑整数部分等于0的情形,程序中单独处理)。
然后,把代表整数部分的long类型变量转换成String类型,取得该String的长度len,接下来就是遍历这个字符串了(一层for循环)。那么,对于正在处理的第i个字符,就存在很多问题值得思考了。下面列出在循环里可能遇到的情况和相应的解决方法:
Q1:要问自已的第一个问题是:这个字符是属于1~4位、或者5~8位呢,还是处于9~12位呢?在这里,假设1~4位是第0段,5~8位是第1段,9~12位是第2段。这里我是这样解决这个问题的,利用(len - i - 1) / 4来计算该字符属于哪一段(本人在下面已经测试过,不信的人可以自已在草稿上测试)。
Q2:确定了当前字符属于哪一段之后,那么,在该段内部,考虑到一个字符在段的不同位置需要不同处理的问题(比如:处于某段最后一位的