`
godandghost
  • 浏览: 33433 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

把数字转汉语

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

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, "壹拾亿壹仟万元整");
}
分享到:
评论

相关推荐

    汉语大写数字转换成阿拉伯数字

    汉语大写数字转换成阿拉伯数字。支持如下转换 '一千二百二十一万九千三百五十七亿一千二百二十一万九千零五十七', '一千二百二十一', '一千零十', '一万零一百', '一千零十一', '一万零一百十一', '一千二百...

    c语言数字转汉语读法

    可以将任意长度的数字转换为汉语口语的读法、 对于支持语音模块的单片机可以直接实现口语报数 例如: 12345 一万两千三百四十五 10001 一万零一 9020012 九百零二万零一十二

    中文数字转成阿拉伯数字 java 实现

    独立开发,实测可用, 将阿拉伯和中文数字组合的字符串转成阿拉伯数字的整型 包。例如: “八万三千20”就可以转成整型 803020 。解压后,引用包。调用方法 在UnitTest.java 中有

    Delphi实现数字与汉字的转换

    用Delphi实现数字与汉字的转换源码

    用C++编写数字转换成汉字大写的程序

    受人委托所作,仍有许多不足,希望与大家一起探讨,一起学习,本人将洗耳恭听

    数字转汉语大写【未优化版】

    把数字转换为钱币的大写汉字表示,此算法无优化,仅实现10亿以内,小数点后2位精度

    罗马数字直接转换成中文大写人民币数字

    可把罗马数字直接转换成中文大写人民币数字 例如: 1-壹 2-贰 4-肆

    如何将汉语数字转为阿拉伯数字

    该小程序写了如何把十万亿以内的汉语数字字符串转换成阿拉伯数字。基本上实现了转换要求,但肯定还存在许多问题,比较语法上的、算法最优等。没有写捕获异常和用户输入语法检查。

    java实现阿拉伯数字转汉字数字

    主要为大家详细介绍了java实现阿拉伯数字转换为汉字数字源代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    数字转换为人民币的大写

    数字转换为人民币的大写 把输入的金额转换为汉语中人民币的大写

    数字 货币转中文描述

    这个可以将数据转化为“壹亿貳仟叁佰肆拾伍万陆仟柒佰捌拾玖元零角壹分”这样的显示,将货币数字转为了大写的表示

    js,实现中文转换成拼音,会有用得上的地方,

    使用javascript实现对一些中文转换成为一个汉语拼音,测试过有用,但是不是所用的汉字都可以转,使用时可以改

    【汉谷应用方案】数字操作系统

    数字操作系统通过汉字数码规则将数字化产品的汉语操作指令转换为唯一对应的数字操作命令,通过数字键盘或数字语音就能准确无误地操控数字化产品,无需配置屏幕、鼠标、甚至键盘,可让操作方式数字化、微型化、随身化...

    将汉语转化为拼音 可实现大写等功能

    上次开发一个项目中的到的,将用户的汉语名称转化为拼音作为这个人的编码。

    VWW.rar

    这是我很久以前做的一个数字转换系统, 输入汉语数字,系统可以将其转换为阿拉伯数字

    火星字转换软件 V1.01

    该软件可以将汉字,英文,数字等等转化成火星文,并有着强大的字库自定义功能,使用户可以随心所欲的定义自己特有的火星字,绝对是一款火星利器。 火星字体转换器使用说明: 1.执行程序,系统默认导入Defaultfont...

    Bopomofo.js拼音转换库-其他

    2、实现汉语单词转拼音 3、实现汉语句子转拼音,在一定程度解决多音字问题 原理: 1、获取当前汉字的unicode值,如果在[19968,40869]中文区间,则执行第2步,否则直接输出(可能为符号,数字,英文字母或其他语系) ...

    NumberToCNUtil.java

    汉语中数字大写,把输入的金额转换为汉语中人民币的大写,汉语中货币单位大写,金额的精度,"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖

    Sequence to Sequence模型理解

    1.Encoder部分:对于输入的一句汉语,将其切割成汉语词语,通过查汉语词典得到词语对应的数字,将每个数字转换为一个固定长度的向量,作为循环神经网络RNN的输入,例如X1,X2,X3X_1,X_2,X_3X1​,X2​,X3​,先输入X1X

    汽车牌照的排序与查找问题-数据结构与算法课程设计报告

    在对车牌号进行查找时,先对车牌号进行排序,然后将车牌号中的汉字及字符均转换成一个长整形数据存储在一个预先定义的一个一维数组中并把需要查找的车牌号码也转换成一个长整型数据,然后在原先的一维数组中使用二分...

Global site tag (gtag.js) - Google Analytics