`
xshq
  • 浏览: 44113 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

数字转化成大写解析器

 
阅读更多

      数字转化成大写解析器,可以实现把16384位数的数字字符串转换成大写数字,扩展长度比较方便,只要增加单位和对应的位数就可以实现。

      在此把源代码贴出来,方便大家进行讨论

 

 

import java.util.ArrayList;

//解析器
public class Interpret {

	// 数字
	private final String[] digits = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
			"捌", "玖" };

	// 数量单位
	private final String[] units = { "", "拾", "佰", "仟", "万", "亿", "兆", "京",
			"垓", "秭", "穰", "沟", "涧", "正", "载", "无" };

	// 数量单位对应的位数
	private final int[] pows = { 0, 1, 2, 3, 4, 8, 16, 32, 64, 128, 256, 512,
			1024, 2048, 4096, 8192, 16384, Integer.MAX_VALUE };

	private final StringBuffer buf = new StringBuffer();

	// pre:前一位是否为零、cur:当前位是否为零、seg:当前单位是否全为零
	private static boolean pre = false, cur = false, seg = false;

	private static Interpret inter = null;

	private Interpret() {
	}

	public static Interpret getInstance() {
		if (inter == null)
			inter = new Interpret();
		return inter;
	}

	private ArrayList<AConver> convs = new ArrayList<AConver>();

	private String numStr;

	// 解析器计数器
	private int count = 0;

	public int getCount() {
		return count;
	}

	public String conver(String numStr) throws Exception {
		// 清空缓存
		buf.delete(0, buf.length());
		// 分析数字字符串
		if (!numStr.matches("\\d*"))
			throw new Exception("请输入整数!");
		if ("".equals(numStr))
			return "";
		this.numStr = numStr.replaceAll("\\b0*", "");
		if ("".equals(numStr))
			return digits[0];

		int convLen = 0; // 解析器长度
		while (pows[convLen] < numStr.length())
			convLen++;

		// 添加单位解析器
		for (int i = convs.size(); i < convLen; i++) {
			if (i < 4) // 4对应万
				convs.add(new Unit(i));
			else
				convs.add(new Complex(i));
		}

		// 进行解析
		for (int i = convLen - 1; i >= 0; i--)
			convs.get(i).conver();
		return buf.toString();
	}

	// 内部类:单位解析器
	abstract class AConver {

		protected int unit;

		protected int pow;

		public abstract void conver();
	}

	// 内部类:简单单位解析器
	class Unit extends AConver {

		private Unit(int unit, int pow) {
			this.unit = unit;
			this.pow = pow;
			count++;
		}

		public Unit(int unit) {
			this(unit, pows[unit]);
		}

		public void conver() {
			int end = numStr.length() - pow;
			if (numStr.length() > pow) {
				int num = Integer.parseInt(numStr.substring(end - 1, end));
				pre = cur;
				if (num != 0) {
					//添加零
					if (!pre && buf.length() > 0)
						buf.append(digits[0]);
					
					buf.append(digits[num]).append(units[unit]);
					cur = true;
				} else
					cur = false;
			}
		}
	}

	// 内部类:复杂单位解析器
	class Complex extends AConver {

		private ArrayList<AConver> convs = new ArrayList<AConver>();

		private Complex(int unit, int pow) {
			this.unit = unit;
			this.pow = pow;
			count++;

			// 添加解析器
			if (unit < 4) // 4对应万
				convs.add(new Unit(unit, pow));
			else
				for (int i = 0; i < unit; i++)
					if (i < 4) // 4对应万
						convs.add(new Unit(i, pows[i] + pow));
					else
						convs.add(new Complex(i, pows[i] + pow));
		}

		public Complex(int unit) {
			this(unit, pows[unit]);
		}

		public void conver() {
			for (int i = convs.size() - 1; i >= 0; i--) {
				convs.get(i).conver();
				seg |= cur;
			}
			// 添加单位
			if (seg) {
				buf.append(units[unit]);
				pre = cur;
				cur = true;
			}
		}
	}
}

 

// 测试类
public class Client {

	public static void main(String[] args) throws Exception {

		StringBuffer strBuf = new StringBuffer("10000000000");
		for (int i = 0; i < 10; i++) {
			System.out.println(Interpret.getInstance().conver(
					strBuf.delete(strBuf.length() - 1, strBuf.length())
							.toString()));
			System.out.println(Interpret.getInstance().getCount());
		}
	}
}

 

 

输出结果

壹拾亿万
19
万壹亿万
19
壹仟万
19
壹佰万
19
壹拾万
19
壹万
19
壹仟
19
壹佰
19
壹拾
19
壹
19

 

分享到:
评论

相关推荐

    数字小写改大写工具

    "数字小写改大写工具"正是为了满足这一需求而设计的,它能够帮助用户快速且准确地将数字金额从小写形式转换为大写形式,这对于填写财务报表、合同以及银行结算单等正式文件来说极其方便。 在财务文件中,大写数字的...

    大写金额转换器

    【大写金额转换器】是一种实用工具,专为金融、会计和商业领域的用户设计,能够将数字金额转换成中文大写形式。在处理财务文件、合同或者发票时,按照中国的传统,金额通常需要以中文大写来表示,以增强文档的清晰度...

    人民币大写转换器

    《人民币大写转换器》是一款专门用于将阿拉伯数字形式的人民币金额转换成规范的大写汉字表示的工具。在金融、会计等领域,为了确保交易的准确性和合法性,通常需要使用大写汉字来表示金额,避免因小数点或零的误读...

    金钱大写转小写数字类java(精确到角)

    在实际项目中,为了提高代码的可维护性和可扩展性,可以将映射表和解析逻辑封装成更独立的组件,例如使用枚举类型表示中文数字和单位,或者创建一个解析器类来处理不同的部分。 总的来说,实现中文大写转小写数字的...

    九键字母转换数字

    这里的关键在于计算方法:减去 65 是为了将 A 转换成 0,然后除以 3 是因为每三个字母对应一个数字键,最后加上 50 是为了将结果转换成 ASCII 表中的数字字符。 - **处理 S-Z 字母**:对于范围 `[83, 90]` 内的字符...

    JS实现数字字母混合验证码(数字+大写字母+小写字母)

    `getRandomInt`函数用于生成指定范围内的随机整数,`getRandomText`函数则根据随机生成的整数(1-3)来确定生成数字、大写字母还是小写字母,并利用`String.fromCharCode`将ASCII码转换为字符。 为了使验证码更具...

    16进制显示转换二进制.vi_16进制转化二进制_

    标题"16进制显示转换二进制.vi_16进制转化二进制_"暗示这是一个虚拟仪器(VI)程序,专门用于将16进制数值转换成2进制表示。这种转换在处理二进制数据、内存表示、网络通信和许多其他IT应用中非常常见。 16进制...

    人民币大小写工具.zip

    工具通过解析输入的数字字符串,根据这些规则进行转换,最后输出对应的中文大写金额。 三、使用步骤 1. 运行“人民币大小写工具.exe”程序。 2. 在输入框中输入需要转换的阿拉伯数字金额。请注意,输入的数字应...

    ascii码转换器

    例如,当你需要将一个字符转换成其对应的16进制表示时,这个过程就涉及到了ASCII码和16进制之间的转换。16进制是一种十六进制数制,使用16个符号(0-9及A-F)来表示数值,对于ASCII码来说,每个字符都可以用两个16...

    ascii转换器1ascii转换器

    2. **ASCII到文本**:相反,转换器也可以解析ASCII码并将其还原成可读的文本。这对于理解和处理由ASCII码组成的文件或数据流非常有用。 3. **二进制到ASCII**:除了基本的文本转换,某些ASCII转换器还能处理二进制...

    java 大小写转换

    - 将整数部分的每个数字逐一转换成大写形式,并在适当位置添加单位。 - 对于小数部分,如果非零,则转换为大写形式。 #### 5. 示例代码 - **实例化对象**:`changeToBig a = new changeToBig();` - **调用方法**...

    ASCII.字符转换器

    转换器通过读取用户输入或文件内容,解析其中的字符,然后按照ASCII码表将其转换为相应的数字或相反的过程。 对于进制转换,转换器会利用数学方法,例如模运算和除法,将数字从一种进制转换为另一种进制。例如,将...

    写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母数

    `)将字符串分割成多个子字符串,再对每个子字符串进一步分割(如`,`),并将分割后的字符串转换成数字类型。 #### 实现步骤 1. **初始化数组**:定义一个二维数组,用于存储解析后的数值。 2. **分割字符串**:...

    ASCLL码转换器

    ASCLL码转换器可以方便地将这些数值与字符进行互换,这对于调试程序、解析文本数据或理解网络通信中的字符编码问题都有很大帮助。例如,如果你有一个字符串的ASCII码表示,你可以使用这个工具将其转化为可读的文本;...

    数字电子技术第三章(组合逻辑电路)作业与答案解析.doc

    * 译码器的概念:译码器是一种数字电路,用于将多个输入信号转换为一个输出信号。 * 译码器的应用:译码器广泛应用于数字系统中,例如在计算机系统中用于地址译码和数据选择。 六、控制电路的设计 * 控制电路的...

    ASCII码进制转换器

    综上所述,ASCII码进制转换器是连接人类语言和计算机语言的桥梁,它允许我们将文本和数字在不同的表示形式之间灵活转换,这对于编程、数据解析和通信都至关重要。无论是字符到ASCII码的转换,还是从ASCII码到不同...

    多进制数转换器

    多进制数转换器是一种工具,用于在不同的数值表示系统之间进行转换,如二进制(Binary)、八进制(Octal)、十进制(Decimal)和十六进制(Hexadecimal)。此外,它还涉及到ASCII码,一种将字符与特定数值关联起来的...

    数字对应字母输出vs2010文件

    运行程序时,VS2010会使用预设的编译器和链接器将源代码转化为可执行文件,然后执行这个文件以显示数字到字母的转换结果。 【标签】"数字对应字母"进一步强调了这个程序的核心功能,即数字与ASCII码字母之间的转换...

    ASCII及进制转换器

    例如,十进制数10转换成二进制是1010,转换成十六进制是A。 进制转换器是一种工具,能够帮助用户在这些数制之间轻松转换数值。例如,"ASCII及进制转换 V4.0.exe"很可能是一个软件程序,专门设计用于进行ASCII码和...

    转换工具 ASCII码随心换!

    例如,当处理原始网络数据或编写低级别协议解析器时,直接处理ASCII码可能会比处理字符更加方便。此外,ASCII码也常用于基础的编码教学,帮助学习者理解字符与计算机内部表示之间的关系。 总而言之,“ASCII码随心...

Global site tag (gtag.js) - Google Analytics