在汉语中我们数字0,1,2,3,4,5,6,7,8,9通常对应下面的汉字:
"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"
一个4位的数字我们可以读作几千几百几十几。其单位是看这四个数位于哪里。
如果这4个数字出现在1~4位,则其单位就是个,出现在5~8位其单位就是万,
出现在9~12位,其单位就是亿。
下面给出一个浮点数,最终保留两位,编程计算这个浮点数的中文钱币的读法。
输入:
12345678.123
23001307
1290905004.304
1200000
输出:
壹千贰百叁十肆万伍千陆百柒十捌元壹角壹分
贰千叁百万壹千叁百零柒元
壹十贰亿玖千零玖十万伍千零肆元叁角
壹百贰十万元
书上代码只实现了4位数以内的程序,也没有实现小数点后两位的表示。然后让读者扩展。
我把它扩展成1e12,然后包含角和分的表示,我的代码没有考虑0元的情况。如果还想完善可以再加
个条件就成了。
基本思路:
(1)4位一处理,提取小数的整数部分,如果整数部分长度不是4的倍数,那么就在前面补
零,让它的长度变成4的倍数。然后每次提取四位进行处理。
(2)步骤1完后,对于答案字符串中连续的零,只保留一个。同时如果0后有单位或权值那么
这个0也要被去掉。
(3)对于第一步加了前导0的情况,最终答案第一位是0,通过判断把这个0去掉即可。
(4)处理两个小数位
代码:
package learn;
import java.util.Arrays;
/**
* @Description 把一个浮点数转变为中文读法
* @author WenYaxin
* @date 2017/9/15
*/
public class NumberTransToRMB {
//中文数组读法
private String[] hanArr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//中文的单位
private String[] powerArr = {"千","百","十",""};
private String[] unitArr = {"元","万","亿"};
/**
* 把一个浮点数分解成整数部分和小数部分
* @param num 需要被分解的浮点数
* @return 分解出来的整数部分和小数部分。第一个数组元素时整数部分,第二个数组元素时小数部分
*/
private String solve(double num) {
long integerPart = (long)num; //整数部分
int floatPart = (int)((num-integerPart)*100); //保留两位小数
String part1 = String.valueOf(integerPart);
int len = part1.length();
String temp = "";
if(len%4 != 0)
{
for(int i = len; i < (len/4+1)*4 ; i++)
temp += '0';
part1 = temp + part1;
}
len = part1.length();
int start = len-1;
int i,j = 0,k;
String result = "";
while(start > 0) {
i = start - 3;
k = i;
String hanstr = "";
for( ; i <= start; i++){
int index = part1.charAt(i)-48;
if(index != 0) {
hanstr = hanstr + hanArr[index] + powerArr[i-k];
}else {
hanstr = hanstr + hanArr[index];
}
}
hanstr += unitArr[j];
result = hanstr + result;
start = k-1;
j++;
}
temp = result;
result = "";
char pre = temp.charAt(0);
result += pre;
len = temp.length();
for(i = 1; i < len; i++) {
char now = temp.charAt(i);
if(now == pre && pre == '零') {
pre = now;
continue;
}else {
if(now == '千' || now == '百' || now == '十' || now == '亿' || now == '万' || now == '元') {
int resultLen = result.length();
if(result.charAt(resultLen-1) == '零') {
result = result.substring(0,resultLen-1);
}
}
result += now;
pre = now;
}
}
if(result.charAt(0) == '零')
result = result.substring(1,result.length());
if(floatPart != 0) {
int num2 = floatPart%10;
floatPart = floatPart/10;
int num1 = floatPart%10;
if(num1 != 0)
result = result + hanArr[num1] + '角';
if(num2 != 0)
result = result + hanArr[num2] + '分';
}
return result;
}
public static void main(String args[]) {
NumberTransToRMB rmb = new NumberTransToRMB();
System.out.println(rmb.solve(15158));
}
}