思路分析
实践代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Num2String {
//数字对应关系
private static Map<Integer, String> numberStringMap = new HashMap<Integer, String>();
//位数对应关系
private static Map<Integer, String> base10StringMap = new HashMap<Integer, String>();
/**
* 数字和字符串的对应关系;
*/
static {
numberStringMap.put(0, "零");
numberStringMap.put(1, "壹");
numberStringMap.put(2, "贰");
numberStringMap.put(3, "叁");
numberStringMap.put(4, "肆");
numberStringMap.put(5, "伍");
numberStringMap.put(6, "陆");
numberStringMap.put(7, "柒");
numberStringMap.put(8, "捌");
numberStringMap.put(9, "玖");
base10StringMap.put(1, "");
base10StringMap.put(2, "十");
base10StringMap.put(3, "百");
base10StringMap.put(4, "千");
base10StringMap.put(5, "万");
}
/**
* 主函数,程序从这里开始执行
*/
public static void main(String[] args) {
//初始化 int数组,设定有一下6个数字;
int a[] = { 2000042, 1298302000, 1003, 1030, 1000, 20000000 };
//遍历数组,输出这六个数字的读法;
for (int i = 0; i < a.length; i++) {
//输出单个数字的读法
readChinese(a[i]);
}
}
private static void readChinese(int a) {
//将数字由int 转化为 String 类型
String intString = a + "";
//将String类型 转化为 字符数组char[]
char ichar[] = intString.toCharArray();
//将字符数组 顺序颠倒 --> 比如:ichar = ['1','2','3'] ,执行revertCharArray(ichar)方法后,变为['3','2','1']
//为什么要这样做呢? --> 为了方便数字从低位开始读起;
char icharrevert[] = revertCharArray(ichar);
int i = 0;
String result = "";
//从颠倒后的数组icharrevert中读取字符,每次读取4位,如果数组长度不足4位,则读取到数组最大长度即可;
/**
* 举例说明: 如输入的数字是 200 0042;
* 顺序颠倒后,得到的字符数组icharrevert[] = ['2','4','0','0','0','0','2']
* 第一次读取4个字符,2,4,0,0
* 逆序读起,即0,0,4,2; 字符串读法为 零肆拾贰
* 第二次读取3个字符;
* 逆序读起,即2,0,0;字符串读法为贰佰,第二次读起所以,后面加一个万;最后输入读法为贰佰万;
*
* 最后输出结果为; 贰佰万零肆拾贰
*/
while (i < icharrevert.length) {
//一次读取字符数组中的4个字符
char[] icharsplit = Arrays.copyOfRange(icharrevert, i, i + 4 < icharrevert.length ? i + 4
: icharrevert.length);
//对输入的字符,转化为字符读法
result = processSplitedNumber(icharsplit, (i + 1) / 4) + result;
i = i + 4;
}
System.out.println("原数字为:"+a+"切换后的读法为:"+result);
}
//字符逆序
private static char[] revertCharArray(char[] ichar) {
char icharNew[] = new char[ichar.length];
for (int i = ichar.length - 1, j = 0; i >= 0 && j < ichar.length; i--, j++) {
icharNew[j] = ichar[i];
}
return icharNew;
}
/**
* 字符转换为字符串读法
* @param num 字符数组
* @param time 次数
* @return
*/
private static String processSplitedNumber(char[] num, int time) {
StringBuffer sb = new StringBuffer();
//逆序读起
for (int i = num.length - 1; i >= 0; i--) {
// sb.append(num[i]);
if (num[i] == '0') {
/**
* 当前数字是0.并且是最后一位,直接不读
*/
if (i == 0) {
continue;
}
/**
* 当前数字是0,下一个数字不是0,补一个0上去读
*/
if (num[i - 1] != '0') {
sb.append(numberStringMap.get(Integer.valueOf(num[i] + "")));
} else {
continue;
}
} else {
/**
* 如果当前位数不是0,那就正常的读出数字和位
*/
//读数字
sb.append(numberStringMap.get(Integer.valueOf(num[i] + "")));
//读位数
sb.append(base10StringMap.get(i + 1));
}
}
if (time == 0) {
} else if (time == 1) {
/**
* 每4位读一次,第二次读取完毕,后面加"万"
*/
sb.append("万");
} else if (time == 2) {
/**
* 每4位读一次,第三次读取完毕,后面加"亿"
*/
sb.append("亿");
}
return sb.toString();
}
}