把数字转汉语

闲来无事,写了一段把数字转成汉语读法的代码,在不考虑效率的情况下,基本可以实现数字的转化了。

import java.util.List;
import java.util.Map;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

public class NumberToChinese {

	private static Map<Integer, String> unitMap = initUnitMap();
	private static Map<Character, String> numberMap = initNumberMap();
	private static Map<Integer, String> decimalUnitMap = initDecimalUnitMap();

	public static String convertNumberToChinese(String number) {
		String integerPart = "";
		String decimalPart = "";

		if (number.contains(".")) {
			integerPart = number.substring(0, number.indexOf("."));
			decimalPart = number.substring(number.indexOf(".") + 1);
		} else {
			integerPart = number;
		}

		String chinese = convertInteger(integerPart);
		if (decimalPart.isEmpty()) {
			chinese += "整";
		} else {
			chinese += convertDecimal(decimalPart);
		}
		return chinese;
	}

	/**
	 * 转换整数数部分,不考虑首位为0的情况
	 * 
	 * @param decimalPart
	 * @return
	 */
	private static String convertInteger(String str) {
		String chinese = "";
		// 反转一下,从个位开始读
		List<Character> charList = Lists.charactersOf(str).reverse();
		for (int i = 0; i < charList.size(); i++) {
			char c = charList.get(i);

			if (c == '0') {
				if (i % 4 == 0) {
					chinese = unitMap.get(i) + chinese;
				} else if (charList.get(i - 1) == '0') {
					continue;
				} else {
					chinese = numberMap.get(c) + chinese;
				}
			} else {
				chinese = numberMap.get(c) + unitMap.get(i) + chinese;
			}
		}
		return chinese;
	}

	/**
	 * 转换小数部分,省略超过3的部分
	 * 
	 * @param decimalPart
	 * @return
	 */
	private static String convertDecimal(String decimalPart) {
		if (decimalPart.length() > 3) {
			decimalPart = decimalPart.substring(0, 3);
		}

		String chinese = "";
		List<Character> charList = Lists.charactersOf(decimalPart);
		for (int i = 0; i < charList.size(); i++) {
			char c = charList.get(i);
			chinese += numberMap.get(c) + decimalUnitMap.get(i);
		}
		return chinese;
	}

	private static Map<Character, String> initNumberMap() {
		Map<Character, String> numberMap = Maps.newHashMap();
		numberMap.put('1', "壹");
		numberMap.put('2', "贰");
		numberMap.put('3', "叁");
		numberMap.put('4', "肆");
		numberMap.put('5', "伍");
		numberMap.put('6', "陆");
		numberMap.put('7', "柒");
		numberMap.put('8', "捌");
		numberMap.put('9', "玖");
		numberMap.put('0', "零");
		return numberMap;
	}

	private static Map<Integer, String> initDecimalUnitMap() {
		Map<Integer, String> unitMap = Maps.newHashMap();
		unitMap.put(0, "角");
		unitMap.put(1, "分");
		unitMap.put(2, "厘");
		return unitMap;
	}

	private static Map<Integer, String> initUnitMap() {
		Map<Integer, String> unitMap = Maps.newHashMap();
		unitMap.put(0, "元");
		unitMap.put(1, "拾");
		unitMap.put(2, "佰");
		unitMap.put(3, "仟");
		unitMap.put(4, "万");
		unitMap.put(5, "拾");
		unitMap.put(6, "佰");
		unitMap.put(7, "仟");
		unitMap.put(8, "亿");
		unitMap.put(9, "拾");
		unitMap.put(10, "佰");
		unitMap.put(11, "仟");
		unitMap.put(12, "兆");
		unitMap.put(13, "拾");
		unitMap.put(14, "佰");
		unitMap.put(15, "仟");
		return unitMap;
	}

}



测试结果:
@Test
public void test1() {
	String number = "324324.234343";
	String chinese = NumberToChinese.convertNumberToChinese(number);
	Assert.assertEquals(chinese, "叁拾贰万肆仟叁佰贰拾肆元贰角叁分肆厘");
}

@Test
public void test2() {
	String number = "32432443242343";
	String chinese = NumberToChinese.convertNumberToChinese(number);
	Assert.assertEquals(chinese, "叁拾贰兆肆仟叁佰贰拾肆亿肆仟叁佰贰拾肆万贰仟叁佰肆拾叁元整");
}

@Test
public void test3() {
	String number = "111000100100";
	String chinese = NumberToChinese.convertNumberToChinese(number);
	Assert.assertEquals(chinese, "壹仟壹佰壹拾亿零壹拾万零壹佰元整");
}

@Test
public void test4() {
	String number = "11100010000";
	String chinese = NumberToChinese.convertNumberToChinese(number);
	Assert.assertEquals(chinese, "壹佰壹拾壹亿零壹万元整");
}

@Test
public void test5() {
	String number = "1110000000";
	String chinese = NumberToChinese.convertNumberToChinese(number);
	Assert.assertEquals(chinese, "壹拾壹亿壹仟万元整");
}

@Test
public void test6() {
	String number = "1010000000";
	String chinese = NumberToChinese.convertNumberToChinese(number);
	Assert.assertEquals(chinese, "壹拾亿壹仟万元整");
}

猜你喜欢

转载自godandghost.iteye.com/blog/2319481