`
yvfish
  • 浏览: 263894 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Java数字转汉字,数字转大写

 
阅读更多
网上找了一圈,都不合我意,自己花点时间写了一下。
数字不好,逻辑差了点,性能应该还可以。
如果需要修改为转财务大写或转换为语音文件的,可以简单把汉字改一个就行。
package com.lixor;

import java.util.ArrayList;
import java.util.Collections;

/**
 * 数字转中文。最大支持到万亿级别。
 * 
 * @author alex
 * 
 */
public class Num2CN {
	/**
	 * 单位进位,中文默认为4位即(万、亿)
	 */
	public int UNIT_STEP = 4;

	/**
	 * 单位
	 */
	public String[] CN_UNITS = new String[] { "个", "十", "百", "千", "万", "十",
			"百", "千", "亿", "十", "百", "千", "万" };

	/**
	 * 汉字
	 */
	public String[] CN_CHARS = new String[] { "零", "一", "二", "三", "四",
			"五", "六", "七", "八", "九" };

	/**
	 * 数值转换为中文字符串
	 * 
	 * @param num
	 *            需要转换的数值
	 * @return
	 */
	public String cvt(long num) {
		return this.cvt(num, false);
	}

	/**
	 * 数值转换为中文字符串(口语化)
	 * 
	 * @param num
	 *            需要转换的数值
	 * @param isColloquial
	 *            是否口语化。例如12转换为'十二'而不是'一十二'。
	 * @return
	 */
	public String cvt(long num, boolean isColloquial) {
		String[] result = this.convert(num, isColloquial);
		StringBuffer strs = new StringBuffer(32);
		for (String str : result) {
			strs.append(str);
		}
		return strs.toString();
	}

	/**
	 * 将数值转换为中文
	 * 
	 * @param num
	 *            需要转换的数值
	 * @param isColloquial
	 *            是否口语化。例如12转换为'十二'而不是'一十二'。
	 * @return
	 */
	public String[] convert(long num, boolean isColloquial) {
		if (num < 10) {// 10以下直接返回对应汉字
			return new String[] { CN_CHARS[(int) num] };// ASCII2int
		}

		char[] chars = String.valueOf(num).toCharArray();
		if (chars.length > CN_UNITS.length) {// 超过单位表示范围的返回空
			return new String[] {};
		}

		boolean isLastUnitStep = false;// 记录上次单位进位
		ArrayList<String> cnchars = new ArrayList<String>(chars.length * 2);// 创建数组,将数字填入单位对应的位置
		for (int pos = chars.length - 1; pos >= 0; pos--) {// 从低位向高位循环
			char ch = chars[pos];
			String cnChar = CN_CHARS[ch - '0'];// ascii2int 汉字
			int unitPos = chars.length - pos - 1;// 对应的单位坐标
			String cnUnit = CN_UNITS[unitPos];// 单位
			boolean isZero = (ch == '0');// 是否为0
			boolean isZeroLow = (pos + 1 < chars.length && chars[pos + 1] == '0');// 是否低位为0

			boolean isUnitStep = (unitPos >= UNIT_STEP && (unitPos % UNIT_STEP == 0));// 当前位是否需要单位进位

			if (isUnitStep && isLastUnitStep) {// 去除相邻的上一个单位进位
				int size = cnchars.size();
				cnchars.remove(size - 1);
				if (!CN_CHARS[0].equals(cnchars.get(size - 2))) {// 补0
					cnchars.add(CN_CHARS[0]);
				}
			}

			if (isUnitStep || !isZero) {// 单位进位(万、亿),或者非0时加上单位
				cnchars.add(cnUnit);
				isLastUnitStep = isUnitStep;
			}
			if (isZero && (isZeroLow || isUnitStep)) {// 当前位为0低位为0,或者当前位为0并且为单位进位时进行省略
				continue;
			}
			cnchars.add(cnChar);
			isLastUnitStep = false;
		}

		Collections.reverse(cnchars);
		// 清除最后一位的0
		int chSize = cnchars.size();
		String chEnd = cnchars.get(chSize - 1);
		if (CN_CHARS[0].equals(chEnd) || CN_UNITS[0].equals(chEnd)) {
			cnchars.remove(chSize - 1);
		}

		// 口语化处理
		if (isColloquial) {
			String chFirst = cnchars.get(0);
			String chSecond = cnchars.get(1);
			if (chFirst.equals(CN_CHARS[1]) && chSecond.startsWith(CN_UNITS[1])) {// 是否以'一'开头,紧跟'十'
				cnchars.remove(0);
			}
		}
		return cnchars.toArray(new String[] {});
	}

	public static void main(String[] args) {
		String[] testData = ("0,1,2,3,4,5,6,7,8,9,"
				+ "10,11,20,91,"
				+ "110,102,1234,1023,1002,"
				+ "10000,12345,10234,10023,10002,12034,12003,12000,12300,12340,"
				+ "100000,123456,102345,200234,100023,100002,120345,120034,120003,120000,123000,123400,123450,"
				+ "1000000,1234567,2023456,1002345,3000234,1000023,1000002,1203456,1200345,1200034,1200003,1200000,1230000,1234000,1234500,1234560,"
				+ "10000000,12345678,10234567,10023456,10002345,10000234,10000023,12034567,12003456,12000345,12000034,12000003,12000000,12300000,12340000,12345600,12345670,"
				+ "1000000000,1234567890,1023456789,1002300078,1000230067,1000023456,1000002345,1203456789,1200345678,1200034567,1200003456,1200000345,1200000034,1200000003,1230000000,1234000000,1234500000,1234560000,1234567000,1234567800,1234567890,"

				+ String.valueOf(Integer.MAX_VALUE)

		+ ",9223372036854,9002233007200").split(",");
		for (String data : testData) {
			long num = Long.parseLong(data);

			if (num < 0) {
				continue;
			}

			System.out.println(String.format("%-12s \t %s", data,
					new Num2CN().cvt(num,true)));

		}

	}
}



运行结果
0            	 零
1            	 一
2            	 二
3            	 三
4            	 四
5            	 五
6            	 六
7            	 七
8            	 八
9            	 九
10           	 十
11           	 十一
20           	 二十
91           	 九十一
110          	 一百一十
102          	 一百零二
1234         	 一千二百三十四
1023         	 一千零二十三
1002         	 一千零二
10000        	 一万
12345        	 一万二千三百四十五
10234        	 一万零二百三十四
10023        	 一万零二十三
10002        	 一万零二
12034        	 一万二千零三十四
12003        	 一万二千零三
12000        	 一万二千
12300        	 一万二千三百
12340        	 一万二千三百四十
100000       	 十万
123456       	 十二万三千四百五十六
102345       	 十万二千三百四十五
200234       	 二十万零二百三十四
100023       	 十万零二十三
100002       	 十万零二
120345       	 十二万零三百四十五
120034       	 十二万零三十四
120003       	 十二万零三
120000       	 十二万
123000       	 十二万三千
123400       	 十二万三千四百
123450       	 十二万三千四百五十
1000000      	 一百万
1234567      	 一百二十三万四千五百六十七
2023456      	 二百零二万三千四百五十六
1002345      	 一百万二千三百四十五
3000234      	 三百万零二百三十四
1000023      	 一百万零二十三
1000002      	 一百万零二
1203456      	 一百二十万三千四百五十六
1200345      	 一百二十万零三百四十五
1200034      	 一百二十万零三十四
1200003      	 一百二十万零三
1200000      	 一百二十万
1230000      	 一百二十三万
1234000      	 一百二十三万四千
1234500      	 一百二十三万四千五百
1234560      	 一百二十三万四千五百六十
10000000     	 一千万
12345678     	 一千二百三十四万五千六百七十八
10234567     	 一千零二十三万四千五百六十七
10023456     	 一千零二万三千四百五十六
10002345     	 一千万二千三百四十五
10000234     	 一千万零二百三十四
10000023     	 一千万零二十三
12034567     	 一千二百零三万四千五百六十七
12003456     	 一千二百万三千四百五十六
12000345     	 一千二百万零三百四十五
12000034     	 一千二百万零三十四
12000003     	 一千二百万零三
12000000     	 一千二百万
12300000     	 一千二百三十万
12340000     	 一千二百三十四万
12345600     	 一千二百三十四万五千六百
12345670     	 一千二百三十四万五千六百七十
1000000000   	 十亿
1234567890   	 十二亿三千四百五十六万七千八百九十
1023456789   	 十亿二千三百四十五万六千七百八十九
1002300078   	 十亿零二百三十万零七十八
1000230067   	 十亿零二十三万零六十七
1000023456   	 十亿零二万三千四百五十六
1000002345   	 十亿零二千三百四十五
1203456789   	 十二亿零三百四十五万六千七百八十九
1200345678   	 十二亿零三十四万五千六百七十八
1200034567   	 十二亿零三万四千五百六十七
1200003456   	 十二亿零三千四百五十六
1200000345   	 十二亿零三百四十五
1200000034   	 十二亿零三十四
1200000003   	 十二亿零三
1230000000   	 十二亿三千万
1234000000   	 十二亿三千四百万
1234500000   	 十二亿三千四百五十万
1234560000   	 十二亿三千四百五十六万
1234567000   	 十二亿三千四百五十六万七千
1234567800   	 十二亿三千四百五十六万七千八百
1234567890   	 十二亿三千四百五十六万七千八百九十
2147483647   	 二十一亿四千七百四十八万三千六百四十七
9223372036854 	 九万二千二百三十三亿七千二百零三万六千八百五十四
9002233007200 	 九万零二十二亿三千三百万七千二百


分享到:
评论

相关推荐

    java实现数字转换人民币中文大写工具

    该工具使用 StringBuilder 对象来构建大写字符串,并使用数组 NUMBER 和 CBit 来存储中文数字和单位信息。在将数字转换为大写时,工具会根据数字的长度和小数点的位置来确定转换的方式,并使用循环来处理每个数字位...

    java将数字转换成大写字母

    Java 中实现数字金额到中文大写字符的转换 Java 中实现数字金额到中文大写字符的转换是指将阿拉伯数字转换成中文大写的过程。本文将详细介绍 Java 实现数字金额到中文大写字符的转换的知识点。 知识点一: 数字...

    Android中数字转中文,金额转大写

    综上所述,Android中实现数字转中文和金额转大写主要依赖于对数字位值的理解和中文数字的映射。通过创建合适的映射表和处理逻辑,我们可以轻松地完成这类转换任务。在处理口语化转换时,需要特别注意语言习惯和特例...

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

    这个场景下,我们有一个名为“中文数字转成阿拉伯数字 java 实现”的压缩包,包含了一个实现此功能的Java包和一个单元测试类。下面我们将深入探讨这个功能的实现及其相关知识点。 首先,我们要理解中文数字和阿拉伯...

    人民币数字转换成汉字大写

    人民币数字转换成汉字大写 android Java 运行效率

    Java数字金额转大写

    将数字金额转换为大写汉字的java工具类,方便财务相关开发转换金额。

    Java人民币金额数字转换成大写

    在 Java 中,将人民币金额数字转换成大写需要使用 HashMap 来存储中文数字和人民币金额的对应关系。例如,数字 1 对应中文数字 "壹",数字 2 对应中文数字 "贰",以此类推。 在 SimpleMoneyFormat 类中,我们首先...

    java 阿拉伯数字转化中文大写

    根据提供的文件信息,可以看出这是一个Java程序,用于将阿拉伯数字转换为中文大写形式,并且能够处理包含小数点的情况。接下来我们将对这个程序的关键部分进行详细的解析与解释。 ### 核心知识点概述 1. **数据...

    java数字转大写

    总的来说,`java数字转大写`这个任务涉及字符串操作、位运算和对中文数字单位的理解。提供的两个源文件可能展示了不同的实现策略,这为我们提供了学习和比较不同编程思路的机会。实际开发中,可以结合这些代码,创建...

    java钱币小写转换大写

    在Java编程中,将钱币小写金额转换为大写金额是一项常见的需求,特别是在财务系统或者电商平台上,为了符合规范和避免误解,金额通常会以大写形式展示。本知识点主要探讨如何利用Java实现这一功能。 首先,我们需要...

    数字转换成大写,例如:123 转换后:一百二十三

    这个过程通常称为数字汉字转换,它涉及到字符编码、字符串处理以及数学运算等多个方面的知识。下面将详细阐述实现这一功能的关键步骤和涉及的技术点。 首先,我们需要一个完整的汉字数字对照表。这个对照表包括从零...

    将数字转为中文金额的大写方式(Java版)

    将数字转为中文金额的大写方式(Java版) 博文链接:https://lovinchan.iteye.com/blog/202768

    数字转换为大写(JAVA)

    在Java编程中,将数字转换成大写是常见的需求,特别是在处理财务或会计相关的应用时。这个题目描述了一个简单的Java程序设计实验,其目的是将输入的浮点数值转换成中文金额的大写形式。以下是该实验涉及的主要知识点...

    java将字符串中数字转换为中文大写,在输出字符串

    java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字...

    java 把数字转成中文大写,钱转成中文,格式化钱

    java 把数字转成中文大写,钱转成中文,格式化钱,自己写的,有小数,元角分

    小写数字转换大写数字

    在中文环境中,大写数字可以避免因为手写或打印不清造成的误解,提高财务凭证的可读性。 小写数字转换为大写数字的过程涉及到一系列的映射规则。例如,阿拉伯数字1到9分别对应汉字的一、二、三、四、五、六、七、八...

    阿拉伯数字转换为中文大写

    8. 编程实践:我们通过实践了解了如何使用Java语言将阿拉伯数字转换为中文大写数字,并掌握了编程的基本技术和方法。 通过这个示例代码,我们掌握了阿拉伯数字转换为中文大写的技术和方法,并了解了编程语言基础和...

    将阿拉伯数字转换为金额的汉字大写

    本文将深入探讨如何使用Java来实现阿拉伯数字到金额汉字大写的转换。 首先,我们需要了解金额汉字大写的基本规则。在中国,金额的汉字大写有特定的规则,例如1到10的汉字大写分别是壹、贰、叁、肆、伍、陆、柒、捌...

    java 数字转化为汉字大写

    在给定的压缩包中,`Java数字换成汉字大写`应该就是实现了以上逻辑的Java类。通过直接运行和测试这个类,我们可以快速检查其功能是否符合预期。这个类可能包含了一些特殊处理,比如处理0的情况、保留的小数位数限制...

    阿拉伯数字转大写汉字

    ### 阿拉伯数字转大写汉字 #### 概述 在中文环境中,将阿拉伯数字转换为大写汉字是一项非常实用的功能,尤其是在财务、银行系统等需要将金额以大写形式显示的场合。例如,当需要在支票或发票上填写金额时,通常会...

Global site tag (gtag.js) - Google Analytics