`
bruce198
  • 浏览: 236265 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

数字金额转大写

    博客分类:
  • java
阅读更多

public class ConverChMoney {
	private static final String[] CH_NUMBER = {"零","壹","贰","叁","四","五","六","七","八","镹"};//数组下标即为对应的大写数字
	private static final String[] LEVEL1 = {"","十","佰","仟"};
	private static final String[] LEVEL2 = {"","万","亿"};
	private static final String[] UNITS = {"元", "角", "分", "整"};   
	private static final String REGEX = "^(0|[1-9]\\d{0,11})(\\.(\\d\\d))?$";//金额正则表达式格式:123或123.00

	/**将数字金额:123456789转换为大写形式如:壹亿贰千叁百四十五万六千七百八十九元
	 * 金额格式:123或123.00
	 * 将数字金额按4位长度截取,分三级(千、万、亿),最多支持到亿
	 * 缺少金额格式正确性校验
	 * @param args
	 */
	public static void main(String[] args) {
		long startTime=System.currentTimeMillis();   //获取开始时间  
		//String money = "123456789";//壹亿贰千叁百四十五万六千七百八十九元
		String numMoney = "123456789.30";
		System.out.println("数字金额:" + numMoney);
		
		if(!numMoney.matches(REGEX)){
			System.err.println("输入金额错误!");
			System.exit(0);
		}
		String integerNum = "";//整数部分
		String fractionNum = "";//小数部分
		String chMoney = "";
		if(numMoney.indexOf(".") == -1){
			if(!integerNum.equals("0")){
				chMoney += converInteger(numMoney);//转换整数部分
			}
		}else{
			//有小数部分
			integerNum = numMoney.substring(0, numMoney.indexOf("."));
			fractionNum = numMoney.substring(numMoney.indexOf(".")+1);
			chMoney += converInteger(integerNum);//转换整数部分
			if (fractionNum.equals("00")) {   
				chMoney += UNITS[3]; // 添加“整”
			}else if(fractionNum.startsWith("0") && integerNum.equals("0")){
				// 如果整数部分为0,则去掉分前面的“零” 
				chMoney += convertFraction(fractionNum).substring(1);
			}else{
				chMoney += convertFraction(fractionNum);
			}
			integerNum = converInteger(integerNum);////转换整数部分
		}
		
		System.out.println("转换之后:" + chMoney);
		long endTime=System.currentTimeMillis(); //获取结束时间  
		System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
	}
	/**
	 * 转换金额小数部分
	 * @param fractionNum
	 * @return
	 */
	public static String convertFraction(String fractionNum){
		char jiao = fractionNum.charAt(0); // 角   
        char fen  = fractionNum.charAt(1); // 分   
        return (CH_NUMBER[jiao - '0'] + (jiao > '0' ? UNITS[1] : "")) + (fen > '0' ? CH_NUMBER[fen - '0'] + UNITS[2] : ""); 
		
	}
	/**
	 * 转换金额整数部分
	 * @param integerNum
	 * @return
	 */
	public static String converInteger(String integerNum){
		int numLen = integerNum.length();
		int remainder = numLen % 4;//余数
		int divNum = numLen / 4;//取整
		System.out.println("remainder:"+remainder+" divNum:"+divNum);
		StringBuilder chMoney = new StringBuilder("");//最终输出结果
		if(numLen <= 4){
			chMoney.append(convertNumRange(integerNum));
		}else{
			String range;//分割的数字段
			int startIndex = 0;
			int i;
			for(i = 0 ; i < divNum ; i++){
				//从右向左按4位长度依次截取
				startIndex = (numLen - 4)-(i*4);
				range = integerNum.substring(startIndex , numLen - (i*4));
				chMoney.insert(0, convertNumRange(range) + LEVEL2[i]);//加上金额级别("万","亿")
			}
			if(remainder != 0){
				range = integerNum.substring( 0, startIndex);
				chMoney.insert(0, convertNumRange(range) + LEVEL2[i]);//加上金额级别("万","亿")
			}
			
		}
		return chMoney.toString()+UNITS[0];
		
	}
	/**
	 * 转换小于、等于4( <=4) 的整数部分数字
	 * @param number
	 * @return
	 */
	public static String convertNumRange(String number){
		StringBuilder chineseMoney = new StringBuilder("");
		char numChar;
		int indexFromRight = 0;//从右边起开始的索引下标,下标为0表示个位数,1表示10位,2表示百位...
		int maxNumIndex = number.length() - 1;//数字最大下标(下表从0算起,所以为长度减1)
		for(int i = maxNumIndex ; i >= 0 ; i--){
			numChar = number.charAt(i);//将数字从右向左逐一取出
			if(numChar == '0'){
				// 当 numChar 是 0 且不为个位数且 numChar 的右边一位不是0时,插入“零” (避免出现“零零”)
				if(i < maxNumIndex && number.charAt(i + 1) != '0'){
					chineseMoney.append(CH_NUMBER[0]);
				}
			}else{
				chineseMoney.append(LEVEL1[indexFromRight]);//插入"十","佰","仟"
				chineseMoney.append(CH_NUMBER[numChar - '0']);//插入大写数字
			}
			indexFromRight++;//下标加1
		}
		return chineseMoney.reverse().toString();
	}

}
分享到:
评论
1 楼 bardo 2011-04-17  
建议看看这一个

http://bardo.iteye.com/blog/983559

相关推荐

    excel vba数字金额转换大写

    使用excel vba 实现的数字金额转换大写功能,可进行多项选择进行数字金额转换大写,操作简便......

    ios-数字金额转大写金额.zip

    这个"ios-数字金额转大写金额.zip"压缩包可能包含一个示例项目,名为"Demo",用于演示如何实现这个功能。在这个场景中,用户输入数字金额后,系统会自动将其转换为大写的汉字表示,比如"壹仟贰佰叁拾肆元伍角陆分"。...

    数字金额转大写金额

    直接调用就行啦,数字金额转大写中文金额,完全不用改动的

    活字格-数字金额转大写.zip

    "活字格-数字金额转大写"是一个与财务软件或工具相关的项目,它涉及到将数字形式的金额转换成中文大写的表示方式,这是中国金融和会计领域中常见的做法,以确保金额表述清晰且不易篡改。在财务报表、发票和合同等...

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

    本文将深入探讨如何在Android环境中实现这一功能,包括数字转中文以及数字金额转大写,并且会涉及到口语化的转换。 首先,数字转中文主要是将阿拉伯数字(如1、2、3等)转换成中文数字(如一、二、三等)。在Java或...

    Java数字金额转大写

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

    数字金额转大写金额(java,jsp)可以直接调用

    /* * 整数部分最多13位 * 调用方法: * 1.新建类 * 2.直接调用getRMB(String num)函数 * 3.返回大写金额 * */

    FastReport小写金额转大写

    在财务文档或正式报告中,将数字金额转换成大写格式是一种常见的规范要求,尤其在中国。FastReport提供了一种方法,通过编写自定义函数来实现这一转换。本例中的代码展示了一个具体的实现过程,用于将货币类型的数值...

    excel金额转换大写

    excel vba 金额转换大写 加载宏 使用excel vba 实现的数字金额转换大写功能,可进行多项选择进行数字金额转换大写. 注意:将宏安全级别设置为中或低

    java 正则数字金额转换为大写

    输入字符,通过正则验证是否为金额不超过万亿精确到小数点后两位,然后将数字转换为大写 包括后台java正则验证及前台js验证 请输入一个数字(精确到小数点后两位): fdsa54325.54 fdsa54325.54 false 请输入一个...

    水晶报表数字金额转中文大写

    水晶报表数字金额转中文大写,用于水晶报表中将数字金额转换为中文大写的金额

    SQL数字转金额大写函数

    sqlserver数字转金额大写,输入数字返回汉字大写

    js_小写金额转大写金额,大写转小写.js

    通过js代码将小写金额转换成大写金额,将大写金额转换成数字

    数字金额转人民币大写金额

    在IT领域,尤其是在财务软件和会计系统中,数字金额转人民币大写金额是一个常见的功能需求。这个过程主要是为了确保财务记录的准确性,因为大写汉字在金融交易中使用,可以防止数字被篡改,增加了财务凭证的安全性。...

    oracle 数字金额转为汉字大写

    在Oracle数据库环境中,有时我们需要将数字金额转换成汉字大写形式,这在财务报表或理财程序中尤为常见,因为汉字大写是财务领域的一种标准表示方式,可以避免因数字混淆而引发的错误。本篇文章将深入探讨如何在...

    转大写金额源码

    小写金额转大写金额源码 winform

    将数字金额转换为中文大写金额

    将数字金额转换为中文大写金额将数字金额转换为中文大写金额将数字金额转换为中文大写金额

    mysql函数,将数字金额转成人民币大写

    在MySQL数据库中,有时我们需要将数字金额转换成人民币的大写形式,这在财务报表或会计系统中非常常见。为了实现这一需求,我们可以自定义一个函数或者利用现有的字符串处理函数。以下是一个关于如何在MySQL中实现这...

    小写金额转换大写金额函数

    create or replace function sf_get_money(p_num in number default null) 此函数处理数字小写金额转换为大写金额 

    FastReport4小写金额转大写金额

    FastReport 4 小写金额转中文大写金额,C#代码脚本 例子中代码放入Table中TableCell的AfterData事件中

Global site tag (gtag.js) - Google Analytics