`
wuyuhou
  • 浏览: 13936 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

人民币大写转换实现

阅读更多
public class RmbCapitalFormatter {
	
	//大写对应数组
	private static final String RMB_CAPITAL[] = {
			"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾"
	};
	 
	private static final HashMap<String, Integer> RMB_CAPITAL_MAP = new HashMap<String, Integer>();
	static {
		RMB_CAPITAL_MAP.put("零", 0);
		RMB_CAPITAL_MAP.put("壹", 1);
		RMB_CAPITAL_MAP.put("贰", 2);
		RMB_CAPITAL_MAP.put("叁", 3);
		RMB_CAPITAL_MAP.put("肆", 4);
		RMB_CAPITAL_MAP.put("伍", 5);
		RMB_CAPITAL_MAP.put("陆", 6);
		RMB_CAPITAL_MAP.put("柒", 7);
		RMB_CAPITAL_MAP.put("捌", 8);
		RMB_CAPITAL_MAP.put("玖", 9);
		RMB_CAPITAL_MAP.put("拾", 10);
	}
	
	//是圆(复)还是元(简)
	private boolean isSimpleYuan = false;
	
	//是整(复)还是正(简)
	private boolean isSimpleZheng = false;

	public RmbCapitalFormatter() {
	}

	public boolean isSimpleYuan() {
		return isSimpleYuan;
	}

	public void setSimpleYuan(boolean isSimpleYuan) {
		this.isSimpleYuan = isSimpleYuan;
	}

	public boolean isSimpleZheng() {
		return isSimpleZheng;
	}

	public void setSimpleZheng(boolean isSimpleZheng) {
		this.isSimpleZheng = isSimpleZheng;
	}

	public String format(Double data) {
		StringBuilder buf = new StringBuilder();
		boolean isNegative = false;
		if (data < 0) {
			isNegative = true;
			data = 0 - data;
		}
		//整数部分
		long intPart = data.longValue();
		//小数部分,只有前两位小数有意义
		int fractionPart = (int)((data - intPart) * 100);
		if (intPart == 0 && fractionPart == 0) {
			buf.append("人民币零");
			if (isSimpleYuan) {
				buf.append("元");
			} else {
				buf.append("圆");
			}
			if (isSimpleZheng) {
				buf.append("正");
			} else {
				buf.append("整");
			}
			return buf.toString();
		}
		
		String cur = "";		
		boolean needZero = false;
		//亿为一个大循环,四位数是一个小循环
		while(intPart > 0) {
			int lowestFourDigits = (int)(intPart % 10000);
			intPart = intPart / 10000;
			
			if (lowestFourDigits > 0) {
				if (needZero) {
					buf.insert(0, "零");
					needZero = false;
				}
				buf.insert(0, changeFourDigists(lowestFourDigits) + cur);
				if (lowestFourDigits < 1000) {
					needZero = true;
				}
			} else {
				if ("亿".equals(cur)) {
					buf.insert(0, cur);
				}
			}
			if (cur.length() == 0) {
				cur = "万";
			} else if ("万".equals(cur)) {
				cur = "亿";
			}  else if ("亿".equals(cur)) {
				cur = "万";
			}
		}
		if (data > 1) {
			if (isSimpleYuan) {
				buf.append("元");
			} else {
				buf.append("圆");
			}
		}		
		if (fractionPart > 0) {
			int jiaoPart = fractionPart / 10;
			int fenPart = fractionPart % 10;
			if (jiaoPart > 0) {
				buf.append(RMB_CAPITAL[jiaoPart]).append("角");
			}
			if (fenPart > 0) {
				if (data > 1 && jiaoPart == 0) {
					buf.append(RMB_CAPITAL[0]);// 零
				}
				buf.append(RMB_CAPITAL[fenPart]).append("分");
			}
		} else {
			if (isSimpleZheng) {
				buf.append("正");
			} else {
				buf.append("整");
			}
		}
		String result = buf.toString();
		if (isNegative) {
			return "人民币负" + result;
		} else {
			return "人民币" + result;
		}
	}

	//四位整数转换成大写金额
	private static String changeFourDigists(int number) {
		if (number == 0) {
			return "零";
		}
		
		StringBuilder buf = new StringBuilder();
		//千位数部分
		int qianPart = number / 1000;
		number = number % 1000;
		//百位数部分
		int baiPart = number / 100;
		number = number % 100;
		//十位数部分
		int shiPart = number / 10;
		number = number % 10;
		//个位数部分
		int gePart = number;
		
		//是否需要添零
		boolean needZero = false;
		//前面是否有值
		boolean havaValueBefore = false;
		if (qianPart > 0) {
			buf.append(RMB_CAPITAL[qianPart]).append("仟");
			havaValueBefore = true;
		} else {
			havaValueBefore = false;
		}

		if (baiPart > 0) {
			buf.append(RMB_CAPITAL[baiPart]).append("佰");
			havaValueBefore = true;
		} else {
			if (havaValueBefore) {
				needZero = true;
			}
		}

		if (shiPart > 0) {
			if (needZero) {
				buf.append("零");
				needZero = false;
			}
			buf.append(RMB_CAPITAL[shiPart]).append("拾");
			havaValueBefore = true;
		}  else {
			if (havaValueBefore) {
				needZero = true;
			}
		}
		
		if (gePart > 0) {
			if (needZero) {
				buf.append("零");
				needZero = false;
			}
			buf.append(RMB_CAPITAL[gePart]);
		}
		
		return buf.toString();
	}

	public Double unformat(String data) {
		boolean isNegative = false;
		if (data.startsWith("人民币")) {
			data = data.substring(3);
		}
		if (data.startsWith("负")) {
			isNegative = true;
			data = data.substring(1);
		}
		//整数部分
		long intPart = 0;
		//小数部分
		int fractionPart = 0;
		
		//千分位部分
		int qianPart = 0;
		//百分位部分
		int baiPart = 0;
		//十分位部分
		int shiPart = 0;
		//个位部分
		int gePart = 0;
		while(data.length() > 0) {
			String token = data.substring(0, 1);
			
			if (token.equals("零")) {
			} else if (token.equals("整") || token.equals("正")) {
				break;
			} else if (token.equals("角")) {
				shiPart = gePart * 10;
				gePart = 0;
			} else if (token.equals("分")) {
				fractionPart += shiPart + gePart;
				shiPart = 0;
				gePart = 0;
				break;
			} else if (token.equals("圆") || token.equals("元")) {
				intPart += qianPart + baiPart + shiPart + gePart;
				qianPart = 0;
				baiPart = 0;
				shiPart = 0;
				gePart = 0;
			} else if (token.equals("拾")) {
				shiPart = gePart * 10;
				gePart = 0;
			} else if (token.equals("佰")) {
				baiPart = gePart * 100;
				gePart = 0;
			} else if (token.equals("仟")) {
				qianPart = gePart * 1000;
				gePart = 0;			
			} else if (token.equals("万")) {
				intPart += (qianPart + baiPart + shiPart + gePart) * 10000;
				qianPart = 0;
				baiPart = 0;
				shiPart = 0;
				gePart = 0;
			} else if (token.equals("亿")) {
				intPart += qianPart + baiPart + shiPart + gePart;
				intPart = intPart * 100000000;
				qianPart = 0;
				baiPart = 0;
				shiPart = 0;
				gePart = 0;				
			} else {
				gePart = RMB_CAPITAL_MAP.get(token);
			}
			data = data.substring(1);			
		}
		double result = intPart + ((double)fractionPart) / 100;
		if (isNegative) {
			return 0 - result;
		} else {
			return result;
		}
	}
}
分享到:
评论

相关推荐

    python实现人民币大写转换

    本文实例为大家分享了python实现人民币大写转换的具体代码,供大家参考,具体内容如下 #!/usr/bin/python # -*- coding:utf-8 -*- # ********* 转换方法介绍 ********* # 将需要转换的数字从右向左,每4位分成一个...

    java程序实现人民币大写转换

    这是一个把人民币数字转换成大写的java程序

    jsp页面调用applet实现人民币的大小写转换.docx

    通过JSP页面调用Applet实现人民币的大小写转换,可以实时地将用户输入的金额转换为大写或小写形式。该实现方法可以应用于电子商务、银行等领域,提供了一个便捷的金额转换工具。 六、技术要点 * 使用JSP页面调用...

    人民币大写转换程序(非常好用)

    在IT领域,人民币大写转换是一项常见的编程任务,特别是在财务软件或者银行系统中。这个程序设计的目的是将阿拉伯数字形式的人民币金额转换成规范的大写汉字形式,以便于财务报表的标准化和防止篡改。在会计和金融...

    C语言成序设计__实现人民币小写金额与大写金额的转换

    C语言实现人民币小写金额与大写金额的转换 C语言是一种广泛使用的编程语言,具有强大的功能和灵活性。本文中,我们将使用C语言实现人民币小写金额与大写金额的转换。 在中国,人民币的小写金额与大写金额的转换是...

    sql 人民币大写转换函数

    根据给定的SQL函数“MoneyToCapital”,我们可以深入解析并理解其如何实现将人民币数值转换为中文大写的功能。此函数不仅关注基本的数字转换,还考虑了进位处理、精度设定以及数值范围的限制,确保了转换结果的准确...

    JS实现人民币小写转大写

    在JavaScript编程中,有时我们需要将人民币的数字金额(小写)转换为中文的大写形式,以便于财务报表或发票的规范书写。这个过程涉及到字符映射、数字处理以及字符串操作等多个知识点。以下是对这个主题的详细说明:...

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

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

    人民币大写转换的程序源码

    ### 人民币大写转换程序解析 #### 一、概述 在财务系统中,为了确保资金安全及法律合规性,常需要将数字金额转换为大写形式。本篇将基于提供的程序代码片段,深入分析实现人民币金额(不超过亿元)大写转换的逻辑...

    c#人民币小写转换为大写

    这个方法接受一个表示人民币金额的小写字符串,然后通过一系列的除法和取余运算,将每个位上的数字转换成对应的汉字,最后拼接成完整的人民币大写形式。 在实际使用时,你可以这样调用这个方法: ```csharp string...

    人民币大写转换工具,方便不会书写大写人民的人使用

    "人民币大写转换工具"的使用方法通常是输入或粘贴你要转换的数字,然后点击转换按钮,系统会自动生成对应的大写汉字。这样的工具不仅适用于报销单据的填写,还适用于合同、支票等各种财务文件的制作。它极大地提高了...

    网页模板——原生JS实现的人民币数字大写转换特效源码.zip

    原生JavaScript实现的人民币数字大写转换特效源码就是解决这类问题的一个工具。这个网页模板提供了一种高效且灵活的方法,使得前端开发者能够轻松地在网页上实现这一功能。 首先,我们要理解原生JavaScript是如何...

    c语言小程序(人民币小写金额转换成大写金额)

    在C语言编程中,开发一个小程序来将人民币的小写金额转换为大写金额是一项常见的任务,尤其在财务软件或银行系统中。这个程序的核心在于理解人民币金额的表示规则,并将其与C语言的数据处理和字符串操作相结合。下面...

    Java实现人民币大写+GUI界面

    总的来说,实现"Java实现人民币大写+GUI界面"这个功能,需要结合Java的基础语法、GUI编程以及对人民币大写转换规则的理解。通过创建一个能够正确处理各种情况的转换函数,并与用户友好的界面相结合,可以构建出一个...

    delphi源码人民币大写转换.txt

    ### Delphi 源码人民币大写转换解析 在日常财务处理、银行系统以及各种会计应用中,将数字金额转换成大写中文金额是一项常见需求。这种转换在合同签署、发票开具等正式场合中尤为重要,因为大写金额可以有效地防止...

    vb 人民币大小写转换 代码

    以下是一个VB程序的详细分析,它实现了将输入的数字(小写形式)转换为人民币大写的源代码。 首先,我们需要理解整个代码的结构。代码包含三个主要部分:一个事件处理函数`Text2_Change`,一个命令按钮点击事件`...

    人民币大写转换C#代码,运行在服务端的

    标题提到的是一个使用C#编写的程序,用于实现人民币大写转换,并且这个程序是设计在服务端运行的。下面我们将详细讨论这个知识点。 首先,人民币大写转换是将阿拉伯数字(如1, 2, 3...)转换为中文大写数字(如壹、...

    BAT批处理脚本-格式转换-人民币金额小写转大写.cmd.zip

    本文将详细介绍"BAT批处理脚本-格式转换-人民币金额小写转大写.cmd.zip"这个压缩包中的知识点,以及如何利用批处理脚本来实现人民币金额的小写到大写的转换。 首先,我们要理解批处理脚本的基本概念。批处理脚本是...

    C++实现人民币大小写转换

    将阿拉伯数字复制粘贴或输入到“输入小写数字金额”中,比如(123456),然后单击“转换为大写金额”按钮。就会在“显示中文大写金额”框中显示自动转换完成的中文大写内容...

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

    Java 实现数字转换人民币中文大写工具 Java 实现数字转换人民币中文大写工具是指使用 Java 语言将数字转换为人民币中文大写格式的工具。该工具具有很高的实用价值,特别是在人事业务系统开发中,经常需要将数字转换...

Global site tag (gtag.js) - Google Analytics