如何将阿拉伯数字转换成RMB大写格式

代码如下:

/**
 * @author weigeli
 */
public class Change {

	public static final String POINT = ".";
	public static final Integer MAX_LENGTH = 16;
	public static final Integer POINT_RIGHT_MAX_LENGTH = 2;
	public static final char CHAR_ZERO = '0';

	/**
	 * 实验项目名称:数组及字符串:金额转换,阿拉伯数字的金额转换成中国传统的形式 如:
	 * (¥2561011)->(贰佰伍拾陆万壹千零壹拾壹元整)输出。
	 * (¥2561011.56)->(贰佰伍拾陆万壹千零壹拾壹元伍角陆分)输出。 思路:实现转换
	 */
	public static void main(String[] args) {
		Change demo = new Change();
		String out;
		String str1, str2;
		@SuppressWarnings("resource")
		Scanner input = new Scanner(System.in);
		System.out.println("========请输入一个数字(可以包含两位小数)========");
		String str = input.next();
		// 对输入的数字进行判断,不符合要求则重新输入
		boolean flag = true;
		do {
			if (str.contains(POINT)) {
				int location = str.indexOf('.');
				str1 = str.substring(0, location);
				str2 = str.substring(location + 1);
				if (str2.length() == 0 || str2.length() > POINT_RIGHT_MAX_LENGTH || demo.notJudgeNum(str1) || demo.notJudgeNum(str2)) {
					System.out.print("您的输入含有非数字字符或不符合RMB规则,请重新输入:");
					str = input.next();
				} else if (demo.judge(str1) && demo.judge(str2)) {
					System.out.print("您输入的数字不能全为零,请重新输入:");
					str = input.next();
				} else if (str1.length() > MAX_LENGTH) {
					System.out.print("您输入的数字过大,请重新输入:");
					str = input.next();
				} else {
					flag = false;
				}
			} else if (!str.contains(POINT)) {
				if (demo.notJudgeNum(str)) {
					System.out.print("您的输入包含非数字,请重新输入:");
					str = input.next();
				} else if (demo.judge(str)) {
					System.out.print("您输入的数字不能全为零,请重新输入:");
					str = input.next();
				} else if (str.length() > MAX_LENGTH) {
					System.out.print("您输入的数字过大,请重新输入:");
					str = input.next();
				} else {
					flag = false;
				}
			}
		} while (flag);
		
		if (str.contains(POINT)) {
			// ============对小数字符串换处理===================
			int location = str.indexOf('.');
			str1 = str.substring(0, location);
			str2 = str.substring(location + 1);
			out = demo.integerOutPut(str1);
			out += demo.doubleOutPut(str2);
		} else {
			// ===========对没有小数点的字符串的处理============
			out = demo.integerOutPut(str) + "整";
		}
		// =======输出字符串===========
		System.out.println(out);
		System.out.println("==============================================");
	}

	/**
	 * 对输入的字符串的整数部分进行判断,全为零则返回true
	 */
	public boolean judge(String str) {
		boolean flag = true;
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) != CHAR_ZERO) {
				flag = false;
				break;
			}
		}
		return flag;
	}

	/**
	 * 对输入的字符串的整数部分进行判断,若其中包含非数字,则返回false
	 */
	public boolean notJudgeNum(String str) {
		boolean flag = true;
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) < CHAR_ZERO || str.charAt(i) > '9') {
				flag = false;
				break;
			}
		}
		return !flag;
	}

	/**
	 * 整数部分的转换
	 */
	public String integerOutPut(String newStr) {
		Change demo = new Change();
		StringBuilder output = new StringBuilder();
		char[] array = newStr.toCharArray();
		// 对应取值和对应的单位,i代表个、十、佰、仟、万位的依次递增
		for (int i = 1; i <= array.length; i++) {
			// 字符数组的倒数第i位存在且这位字符不是0字符(不为零的部分)
			if (array[array.length - i] != CHAR_ZERO) {
				output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));

			// 字符数组的倒数第i位存在且这位字符是0字符(为零的部分)
			} else if (array[array.length - i] == CHAR_ZERO) {
				// 对个位及以上的位置进行判断
				if (i == 1 && array[array.length - i] == CHAR_ZERO) {
					output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));

				// 对万位及以上的位置进行判断11‘0000
				} else if (i == 5 && array[array.length - i] == CHAR_ZERO) {
					if (array.length >= 9 && array[array.length - 5] == CHAR_ZERO
							// 如果万位到亿位之间全部都是"零",则output字符串中不存在"万"单位
							&& array[array.length - 6] == CHAR_ZERO
							&& array[array.length - 7] == CHAR_ZERO
							&& array[array.length - 8] == CHAR_ZERO) {
						output.insert(0, demo.matching(array[array.length - i]));
					} else {
						output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));
					}

				// 对亿位及以上的位置进行判断
				} else if (i == 9 && array[array.length - i] == CHAR_ZERO) {
					output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));

				// 对万亿位及以上的位置进行判断
				} else if (i == 13 && array[array.length - i] == CHAR_ZERO) {
					output.insert(0, demo.matching(array[array.length - i]) + demo.unit(i));
				} else {
					output.insert(0, demo.matching(array[array.length - i]));
				}
			}
		}
 
		// -------对已经生成的字符串再做加工处理--------
		for (;;) {
			// 将字符串"元整"单位前面的连续"零"都去掉
			if (output.charAt(output.length() - 2) == '零') {
				output = new StringBuilder(output.substring(0, output.length() - 2) + output.substring(output.length() - 1));
			} else if (output.charAt(0) == '零') {
				// 将第一个“零”字去掉
				output = new StringBuilder(output.substring(1));
			} else if (output.charAt(0) == '万') {
				// 将第一个“万”字去掉
				output = new StringBuilder(output.substring(1));
			} else if (output.charAt(0) == '亿') {
				// 将第一个“亿”字去掉
				output = new StringBuilder(output.substring(1));
			} else if (output.toString().indexOf('万') > 0 && output.charAt(output.toString().indexOf('万') - 1) == '零') {
				// 将“万”字符前面的"零"字符去掉
				output = new StringBuilder(output.substring(0, output.toString().indexOf('万') - 1) + output.substring(output.toString().indexOf('万')));
			} else if (output.toString().indexOf('亿') > 0 && output.charAt(output.toString().indexOf('亿') - 1) == '零') {
				// 将“亿”字符前面的"零"字符去掉
				output = new StringBuilder(output.substring(0, output.toString().indexOf('亿') - 1) + output.substring(output.toString().indexOf('亿')));
			} else if (output.indexOf("零零") > 0) {
				// 将所有的重复“零”字符替换为一个“零”
				output = new StringBuilder(output.substring(0, output.indexOf("零零") + 1) + output.substring(output.indexOf("零零") + 2));
			} else {
				break;
			}
		}
		return output.toString();
	}

	/**
	 * 小数点后部分的转换
	 */
	public String doubleOutPut(String newStr) {
		String output;
		char[] array = newStr.toCharArray();
		Change demo = new Change();
		if (array.length == POINT_RIGHT_MAX_LENGTH && array[0] == CHAR_ZERO && array[1] == CHAR_ZERO) {
			output = "整";
		} else if (array.length == 1 && array[0] == CHAR_ZERO) {
			output = "整";
		} else if (array.length == 1) {
			output = demo.matching(array[0]) + "角";
		} else if (array.length == POINT_RIGHT_MAX_LENGTH && array[0] != CHAR_ZERO && array[1] == CHAR_ZERO) {
			output = demo.matching(array[0]) + "角";
		} else if (array.length == POINT_RIGHT_MAX_LENGTH && array[0] == CHAR_ZERO) {
			output = demo.matching(array[0]) + demo.matching(array[1]) + "分";
		} else {
			output = demo.matching(array[0]) + "角" + demo.matching(array[1]) + "分";
		}
		return output;
	}

	/**
	 * 参数的匹配过程
	 */
	public String matching(char parameter) {
		String[] source = new String[]{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
		return source[parameter - CHAR_ZERO];
	}

	/**
	 * 单位
	 */
	public String unit(int i) {
		String[] source = new String[]{"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟"};
		return source[i - 1];
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值