【数组】将一串整型数转换为人民币读法

 最近在啃《疯狂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];
		}










猜你喜欢

转载自blog.csdn.net/Aimee_ice/article/details/79283769