`

Java数字小写转换为大写

阅读更多
闲来无事,在网上搜索了一些面试的题目,开始练习下,下列代码的作用是把数字转换为大写的,主要是人民币的写法,暂时没有考虑小数位。
package com.fit.test01;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DigitalLowerToUpper {

	private static final Map<String, String> digitDict = new HashMap<String, String>();

	static {

		digitDict.put("0", "零");
		digitDict.put("1", "壹");
		digitDict.put("2", "贰");
		digitDict.put("3", "叁");
		digitDict.put("4", "肆");
		digitDict.put("5", "伍");
		digitDict.put("6", "陆");
		digitDict.put("7", "柒");
		digitDict.put("8", "捌");
		digitDict.put("9", "玖");
		digitDict.put("10", "拾");
	}

	/**
	 * 转换
	 * 
	 * @param obj
	 * @return
	 */
	public static String upper(String obj) {

		if (obj.length() > 17) {
			return "Can not process it!";
		}

		if (obj.length() <= 17 && obj.length() > 16) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("10000000000000000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("亿")
						.append("亿").toString();
			}

			if (yushu.toString().length() < 12) {
				return sb.append(getYuanzi(shang.toString())).append("亿")
						.append("亿").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("亿")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 16 && obj.length() > 12) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("1000000000000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("万")
						.append("亿").toString();
			}

			if (yushu.toString().length() < 8) {
				return sb.append(getYuanzi(shang.toString())).append("万")
						.append("亿").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("万")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 12 && obj.length() > 8) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("100000000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().length() == 1 && !yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("亿")
						.append("零").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("亿")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 8 && obj.length() > 4) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("10000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().length() == 1 && !yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("万")
						.append("零").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("万")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 4) {
			StringBuffer sb = new StringBuffer();

			return sb.append(getYuanzi(obj)).toString();
		}

		String result = "";

		return result;
	}

	/**
	 * 格式化字符串中的零
	 * 
	 * @param obj
	 * @return
	 */
	public static String format(String obj) {

		if (!obj.startsWith("0")) {
			return obj;
		}

		Pattern p = Pattern.compile("^0*");
		Matcher m = p.matcher(obj);

		String result = null;

		if (m.find()) {
			result = obj.substring(m.start() + 1);
			m.replaceFirst("");
		}

		if (result.startsWith("0")) {
			return format(result);
		}

		return result;
	}

	/**
	 * 递归调用的原子方法,以万位进位
	 * 
	 * @param obj
	 * @return
	 */
	public static String getYuanzi(String obj) {

		String format = format(obj);

		StringBuffer sb = new StringBuffer();

		if (format.length() == 0) {
			return sb.toString();
		}

		if (obj.equals("0") && obj.length() == 1) {
			return sb.toString();
		}

		if (format.length() != obj.length()) {
			sb.append("零");
		}

		if (format.length() == 4) {
			String qian = format.substring(0, 1);
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append("千")
					.append(getYuanzi(shengxia)).toString();
		}

		if (format.length() == 3) {
			String qian = format.substring(0, 1);
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append("佰")
					.append(getYuanzi(shengxia)).toString();
		}

		if (format.length() == 2) {
			String qian = format.substring(0, 1);
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append("拾")
					.append(getYuanzi(shengxia)).toString();
		}

		if (format.length() == 1) {
			String qian = format.substring(0, 1);
			if (qian.equals("0")) {
				return sb.toString();
			}
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append(getYuanzi(shengxia))
					.toString();
		}

		return sb.toString();
	}

	public static void main(String[] args) {

		// System.out.println(upper("45678123410000010"));
		// System.out.println(upper("40000100000100001"));
		//System.out.println(upper("40000000000000000"));
		//System.out.println(upper("4000000000000"));
		System.out.println(upper("4000000000001"));
		System.out.println(upper("4000001000101"));
		//System.out.println(upper("400000000"));
		//System.out.println(upper("400000001"));
		//System.out.println(upper("400010001"));
		//System.out.println(upper("411110001"));
		//System.out.println(upper("40000"));
		//System.out.println(upper("40001"));
		//System.out.println(upper("40101"));

	}
}


本人在main方法中列举出了一些测试例子,目前为止还么发现问题,哪位高手如果发现了,欢迎大家给我指出来,谢谢。另外,次方法只支持17位一下的转换。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics