最近在啃《疯狂Java讲义》,看到第四章有一道题RT,“折磨”了我这只菜鸟两天时间,到现在终于有点样子了,先记录下来,由于此时没有看书后面的章节,很多知识点还不甚清楚(谁让我在学校上Java的时候水了一波呢,0.0),所以等以后知识点了解得更多的时候再回来重新理一理逻辑,各位看官若觉得有简化的逻辑可tell me,3q~
主要思路为:中国的数字是每四位一节,一个四位数可以转化为几千几百几十几,至于后面加什么单位不确定,但如果这四位数字出现在1~4位,则后面添加单位元;如果这四位数字出现在5~8位,则后面添加单位万;如果这四位数字出现在9~12位,则后面添加单位亿;暂不考虑多于12位的情况。
鉴于此,创建一个3×4的二维数组(初始化值为-1),每四位数存一行,从小到大依次存放,举个栗子123456789159,存为:
a[0] 9 1 5 9 添加单位:元
a[1] 5 6 7 8 添加单位:万
a[2] 1 2 3 4 添加单位:亿
↑ ↑ ↑ ↑
仟佰拾×
具体单位添加见上述栗子,再次就不文字赘述辣~
先上完整代码叭,粗陋之处多多见谅!
package Chapter4;
public class Num2Rmb {
private String[] hanArr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr = {"拾","佰","仟"};
private String[] bigUnitArr = {"元","万","亿"};
private String String2Array(String numStr) {
String result = "";
//定义二维数组
int[][] numArr = new int[3][4];
//初始化二维数组所有值为-1
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4;j++) {
numArr[i][j] = -1;
}
}
//待转换字符串长度
int numLen = numStr.length();
int index = numLen - 1;
//当前待转换字符串下标值
for(int i = 0; i <= numLen / 4;i++) {
for(int j = 3; j >= 0; j--) {
if(index >= 0) {
numArr[i][j] = numStr.charAt(index--) - 48;
}
else {
break;
}
}
}
// 打印输出存好数据的二维数组
for(int i = 0;i < 3;i++) {
for(int j = 0;j < 4;j++) {
System.out.print(numArr[i][j]);
}
System.out.println();
}
for(int i = (numLen - 1) / 4;i >= 0;i--) {
for(int j = 0; j < 4 ; j++) {
int num = numArr[i][j];
//当前位未存入数字
if(num == -1) {
continue;
}
//当前位为0
else if(num == 0) {
//首位为零 或 上一位不为零且该位不是第四位
if(j == 0 || (j != 3 && numArr[i][j-1] != 0))
result += hanArr[0];
}
//当前位不为0
else if(num != 0){
//当前位不是最后一位
if(j != 3) {
result += hanArr[num] + unitArr[2 - j];
}
else {
result += hanArr[num];
}
}
}
// 每四位数一次外循环,
// 若该层四个数均为0,则不加单位
// 循环完毕加上每四位数的大单位
if(numArr[i][0] == 0 && numArr[i][1] == 0 &&
numArr[i][2] == 0 && numArr[i][3] == 0){
continue;
}
result += bigUnitArr[i];
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Num2Rmb nr = new Num2Rmb();
//默认输入数据位数不超过12位
System.out.println(nr.String2Array("800001504"));
}
}
1.先将需要用到的中文字存到对应的数组,如下:
private String[] hanArr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr = {"拾","佰","仟"};
private String[] bigUnitArr = {"元","万","亿"};
2.创建3×4二维数组,用来存放输入的一串整型数字,并初始化数组值为-1:
//定义二维数组
int[][] numArr = new int[3][4];
//初始化二维数组所有值为-1
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4;j++) {
numArr[i][j] = -1;
}
}
3.将测试的整形字符串存入整型二维数组:
//待转换字符串长度
int numLen = numStr.length();
//待转换字符串最大下标值
int index = numLen - 1;
//当前待转换字符串下标值
for(int i = 0; i <= numLen / 4;i++) {
for(int j = 3; j >= 0; j--) {
if(index >= 0) {
numArr[i][j] = numStr.charAt(index--) - 48;
}
else {
break;
}
}
}
4.开始读数,难点在于“0”值的讨论:
我的思路是:1)先从存有数的那一行开始依次遍历一行内四列的数值,若为-1则continue,意思是直接跳到那一行中存有
数值的那列去。
2)讨论当前数num的值,主要分为0和!0的情况。如果当前数num为0,此时开始讨论当前数所处位置,若处于首位或不
在末位且前一位不为零的情况,则需在输出的字符串result中加上hanArr[0],即“零”;如果当前数num不为0,则如书中代码
所列,正常转换成中文就行,但需注意,若当前数为最后一位不添加unitArr[]数组中的单位。
3)遍历完一行后,开始外层循环(注意外循环是从大到小遍历),此时需要判断一个情况:如果该行四个数均为0,则习惯
读法是不添加单位。
for(int i = (numLen - 1) / 4;i >= 0;i--) {
for(int j = 0; j < 4 ; j++) {
int num = numArr[i][j];
//当前位未存入数字
if(num == -1) {
continue;
}
//当前位为0
else if(num == 0 && (j == 0 || (j != 3 && numArr[i][j-1] != 0))) {
result += hanArr[0];
//首位为零 或 上一位不为零且该位不是第四位
// if(j == 0 || (j != 3 && numArr[i][j-1] != 0))
// result += hanArr[0];
}
//当前位不为0
else if(num != 0){
//当前位不是最后一位
if(j != 3) {
result += hanArr[num] + unitArr[2 - j];
}
else {
result += hanArr[num];
}
}
}
// 每四位数一次外循环,
// 若该层四个数均为0,则不加单位
// 循环完毕加上每四位数的大单位
if(numArr[i][0] == 0 && numArr[i][1] == 0 &&
numArr[i][2] == 0 && numArr[i][3] == 0){
continue;
}
result += bigUnitArr[i];
}