⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rmb.java

📁 数字到人民币大写转换程序(java)支持负数
💻 JAVA
字号:
package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;

/**
 * @author songyunpeng
 */
public class Rmb {
	static boolean ISIGNORE = false;//参数用来设置是否忽略错误,true为忽略错误,默认为false
	static List digits = new ArrayList();
	static List setDigits = new ArrayList();
	static {
		digits.add("拾");//0:拾
		digits.add("佰");//1:佰
		digits.add("仟");//2:仟
		digits.add("萬");//,3:萬
		digits.add("拾");//4:拾萬
		digits.add("佰");//,5:佰萬
		digits.add("仟");//6:仟萬
		digits.add("亿");//,7:亿
		digits.add("拾");//8:拾亿
		digits.add("佰");//,9:佰亿
		digits.add("仟");//10:仟亿
		digits.add("兆");//11:兆
		digits.add("拾");//12:拾兆
		digits.add("佰");//,13:佰兆
		digits.add("仟");//仟兆
//		digits.add("京"); //.
//		digits.add("拾");//12:拾京
//		digits.add("佰");//,13:佰京
//		digits.add("仟");//???
		//.....
		setDigits.add("萬");
		setDigits.add("亿");
		setDigits.add("兆");
//		setDigits.add("京"); //
		//.....
		//百度搜索:个、十、百、千、万、十万、百万、千万、亿、兆(10的12次方)、京〔10的16次方)、垓、秭、穰、沟、涧、正、载、极(10的48次方)、恒河沙、阿僧示氏、(梵文译音、意思是无量)、那由他、不可思议(10的64次方)、无量数(∞)。
	}


	public String run(double moneyDb) throws Exception {
		java.text.DecimalFormat fmt = new java.text.DecimalFormat(".00");
		String moneyStr = fmt.format(moneyDb);
		if(moneyDb == 0) {
			return "零圆整";
		}
		return ConvertData(moneyStr);	
	}
	
//	转换RMB函数
	String ConvertData(String moneyParam) throws Exception {
		System.out.println("=====try to fmt:"+moneyParam);
		StringBuffer returnValue = new StringBuffer();
		String [] strMoneys = java.util.regex.Pattern.compile("\\.").split(moneyParam); 
		int len = strMoneys[0].length();
		if(strMoneys[0].startsWith("-")) {
			returnValue.append("负");
			len--;
		}
		strMoneys[0] = strMoneys[0].replaceFirst("-", "");
		//		判断可不可以转
		if(len>digits.size()+1) {
			if(this.ISIGNORE) {
				return moneyParam;
			}
			throw new Exception("函数:RMB出错:数字太大或太小,无法换算.");
		}
		//转整数
		
		for(int i = 0; i < strMoneys[0].length(); i++) {
			String value = strMoneys[0].charAt(i)+"";
			
			returnValue.append(Convert1Digit(value,strMoneys[0].length()-2-i));
		}
		
		String tmp = returnValue.toString();
		//linlin..
		java.util.regex.Pattern p = java.util.regex.Pattern.compile(".*零零.*");//("零零|零萬|零亿");
		java.util.regex.Matcher m = p.matcher(tmp);
		while(m.find()) {
			tmp = tmp.replaceAll("零零","零");
			m = p.matcher(tmp);
		}
		//lindigits
		String preDigitsName="",digitsName;
		for(int i = 0; i < setDigits.size(); i++) {
			digitsName = (String)setDigits.get(i);
			tmp = tmp.replaceAll("零"+digitsName,digitsName);
		}
		if(!setDigits.isEmpty()) {
			preDigitsName = (String) setDigits.get(0);
		}
		for(int i = 1; i < setDigits.size(); i++) {//tmp = tmp.replaceAll("亿萬","亿零");
			digitsName = (String) setDigits.get(i);
			if(tmp.matches(".*"+digitsName.concat(preDigitsName)+".*")) {
				tmp = tmp.replaceAll(digitsName.concat(preDigitsName), digitsName);
				if(digitsName != "" && !(digitsName.equals(""))) {
					tmp = tmp.replaceAll(digitsName, digitsName+"零");
					tmp = tmp.replaceAll("零零", "零");
					//System.out.println("===138");
				}	
			}	
			preDigitsName = digitsName;	
			//java.util.regex.Pattern.matches(regex, input)
		}
		//end of lin
		if(tmp.endsWith("零")) {
			tmp = tmp.substring(0,tmp.length()-1);
		}
		tmp = tmp.concat("圆");
		if(tmp.startsWith("圆")) {
			tmp = tmp.substring(1);
		}
		//转小数
		if(strMoneys[1].equals("00")) {
			return	tmp.concat("整");
		}
		else {
			String rstr = "";
			String tmpstr = strMoneys[1].substring(0, 1);
			String ret = Convert1Digit(tmpstr,-2); 
			if(ret != "零" && !(ret.equals("零"))) {
				rstr = ret.concat("角");
			}
			else if(tmp != "") {
				rstr = "零";
			}
            tmpstr = strMoneys[1].substring(1, 2);
            rstr = rstr.concat(Convert1Digit(tmpstr,-2) + "分");
			return tmp.concat(rstr);
		}
		
		
	}
	
//	digit为-1时是个位-2是小数位不加位名称直接返回大写数 
	private String Convert1Digit(String str,int digit) {
		StringBuffer reStr = new StringBuffer("");
		//System.out.println ("length:"+reStr.length());
		int num = java.lang.Integer.parseInt(str);
		
		if(digit != -2 && num == 0) {//整数对零的处理

			if(digit >= 0 && setDigits.contains(digits.get(digit))) {//万位和亿位是零要念一个万或亿
				reStr.append(digits.get(digit));
			}
			else {
				reStr.append("零");
			}
			return reStr.toString();
		}
		// digit = -1 为个位
		switch(num) {//取值名称,                                      
			case 0: reStr.append("零"); break;
	        case 1: reStr.append("壹"); break;
	        case 2: reStr.append("贰"); break;
	        case 3: reStr.append("叁"); break;
	        case 4: reStr.append("肆"); break;
	        case 5: reStr.append("伍"); break;
	        case 6: reStr.append("陆"); break;
	        case 7: reStr.append("柒"); break;
	        case 8: reStr.append("捌"); break;
	        case 9: reStr.append("玖"); break;
		}
		
		// -1为个位-2为小数,
		if(digit >= 0 ) {//取位名称
			reStr.append(digits.get(digit));
		}
		return reStr.toString();
	}
	
	//test===
	public static void main(String[] args) throws Exception {
		Rmb rmb = new Rmb();
		System.out.println(rmb.run(-45050000000122.2155));
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -