(1) 思路
1.1 分割整数和小数部分
对于一个浮点数,先来看个简单点,不加零。比如12312341234.12。按照中文人民币的读法,四位一读,所以其应该读做“一百二十三亿一千二百三十四万一千二百三十四元一角二分”。首先将浮点数分为两个部分,整数部分(IntPart)和小数(FloatPart)部分。如何分割呢?就是将该浮点数直接强制取整得到整数部分,如: IntPart =(int)12312341234.12=12312341234,然后用原浮点数减去整数部分后再乘以100(因为中文读法最多为角分,为两位),再进行强制转为整数。这样就得到了小数部分。如 12312341234.12-IntPart = 0.12,FloatPart =(int)(0.12*100) = 12。然后分别将小数部分(这时也是个整形)和整形部分在将其变为字符串,然后进行第二步,处理整数部分读法和小数部分读法。
1.2 整数部分转中文字符串
前面已经将浮点数分割为两个部分了,首先先处理整数部分转中文字符串。将字符串逐一变为汉字,首先要建立一个汉字库(利用数组实现)。可以这样 String[] ChineseArr ={“零”,”一”,”二”…}
然后通过逐一扫描整数字符串,将其映射到汉字数组中,也就是利用每个数字本身的算术值,进行索引数组,做映射。比如 1.其数字为1,那么就映射到汉字数组中ChineseArr[1]正好就是汉字“一“。然后将其加入到结果字符串中。对于单位的处理,也是利用一个单位数组来进行映射。String[] UnitArr ={“千”,”百”,”十”}。个位不需要单位。如何确保单位的正确匹配呢?这里就要按照整数部分 4位一划分:123 1234 1234。这样就分为3个部分,然后在逐一处理每个部分,每个部分的处理都可以抽象出来,写成一个子函数,这个函数专门用来处理4位数字变成汉字。比如123 1234 1234将其分为3个部分,”123“,”1234“,”1234“,然后分别调用同一个方法后,再进行扫尾处理。
比如“1234“如何变为汉字串呢?首先逐一扫描字符串,将该字符变为数字,然后映射到汉子数组和单位数组中。
下面为该函数的完整的实现:
- public String NumStr2ChineseStr_IntPartCore(String NumStr)
- {
- String rst = ""; //保存结果 初始化为空
- int len = NumStr.length(); //获取NumStr的长度
- //补零操作
- if(len < 4) //位数小于4位就前补位
- {
- String[] AddZeroStr = { "0","00","000"};
- NumStr = AddZeroStr[4-len-1] + NumStr;
- }
- len = NumStr.length(); //更新长度 其实 len==4
- //扫描至第一个不为0的字符
- int i=0;
- while(i < len && NumStr.charAt(i)-'0'==0)
- ++i;
- if(i==len) //四个数都为零 ,就直接输出一个零 并返回
- {
- rst += "零";
- return rst;
- }
- //四个数不都为0的情况
- for(;i < len; ++i)
- {
- int num = NumStr.charAt(i) - '0';
- if( i != len-1 && num != 0)//不是末尾且不为0
- {
- rst += ChineseArr[num] + UnitArr[i] ;//直接映射汉字和单位
- }
- else
- {
- //若当前结果字符串中最后一位不是“零”,且数字串最后一位不是数字0 这样对中间2个零的只添加一个“零”如1003
- if( rst.length()>0 && rst.charAt(rst.length()-1) != '零' && NumStr.charAt(len-1)-'0'!= 0)
- { //四位中第二,三位至少有一个为0且最后一位数字不为0 如1003 则为一千零三
- if((i==1||i==2) && num == 0)
- rst += "零";
- }
- if( i== len - 1 && num !=0)//是最后一位,且数字不为0 不加单位
- {
- rst += ChineseArr[num];
- }
- }
- }
- return rst; //返回结果字符串
- }