正则表达式将数字金额转成中文和英文

   银行要求如下:

1,中文+数字,数字读中文数目; 例: 尾号1234.5 读:尾号一二三四点五

2, 英文+数字,数字读英文数目

    英文+数字+中文,数字读英文数目  

    例: Number1234.5 密码 读: number one two there four point five 密码

3, 中文+/$数字,数字读中文金额

    例:现金¥100  读:现金一百元 ,现金$100  读:现金一百美元,尾号1234的卡$100 读:尾号一二三四的卡一百美元
4, 英文+/$数字,数字读英文金额

    英文+/$数字+中文,数字读英文金额

    例:Money100 读:money one hundred yuan

        Money $100  读:money one hundred dollars

        Number1234money$100 读:number one two there four money one hundred dollars

        Money $100整 读:money one hundred dollars 

5, 中文+¥数字带小数,小数翻译成元角分; 例:现金¥100.12  读:现金一百元一角两分

6, 中文+$数字带小数,小数直接读; 例:现金$100.12  读:现金一百元点一二美元

7,英文+¥数字带小数,小数直接读 ;例:Money100.12 读:money one hundred point one two yuan

8,英文+$数字带小数,小数直接读;例:Money$100.12 读:money one hundred point one two dollars

9,中文+/$数字—¥/$数字,“—”读至;

   例:现金¥100-200  读:现金一百至两百元

       现金$100-200  读:现金一百至两百美元

10,英文+/$数字—¥/$数字,“—”读to;

       例:Money 100-200  读:money one hundred to two hundred yuan

               Money $100-200  读:money one hundred to two hundred dollars

11, 中文+/$数字中带逗号,去除逗号方式播读

      例: 现金¥10,000 读:现金一万元

               现金$10,000 读:现金一万美元

12:,英文+/$数字中带逗号,去除逗号方式播读

       例:Money ¥10,000 读:money ten thousand yuan

              Money $10,000 读:money ten thousand  dollars


代码如下:

package com.geo.main;

import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumToChinese {
	/**
	 * 直接将数字翻译成对应的中英文的
	 * @param decimal
	 * @param isEnglish
	 * @return
	 */
	private static String formatFractionalPart(int decimal, boolean isEnglish) {
		String[] number;
		if (isEnglish) {
			number = new String[] { " zero", " one", " two", " three", " four",
					" five", " six", " seven", " eight", " nine" };
		} else {
			number = new String[] { "零", "一", "二", "三", "四", "五", "六", "七",
					"八", "九" };
		}
		char[] val = String.valueOf(decimal).toCharArray();
		int len = val.length;
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < len; i++) {
			int n = Integer.valueOf(val[i] + "");
			sb.append(number[n]);
		}
		return sb.toString();
	}
	/**
	 * 将数字翻译成中文,英文,或直接翻译
	 * @param money
	 * @param isEnglish
	 * @return
	 * @throws Exception
	 */
	private static String translateMoney(String money, boolean isEnglish)
			throws Exception {
		StringBuffer rsult = new StringBuffer();

		if (money.matches("[$¥][0-9,\\.]+[\\-][0-9,\\.]+")) {//转义带“-”的数字,例:$100-200
			boolean isYuan = money.startsWith("¥");
			String newMoney = money.replaceAll("[,$¥]", "");
			String[] nums = newMoney.split("-");
			for (int i = 0; i < nums.length; i++) {
				numToChinese(nums[i], rsult, isEnglish);
				if (i == 0) {
					if (isEnglish) {
						rsult.append(" to ");
					} else {
						rsult.append("到");
					}
				}
			}
			String rmb = "";
			if (isYuan) {
				rmb = isEnglish ? " yuan" : "";
			} else {
				rmb = isEnglish ? " dollar" : "美元";
			}
			rsult.append(rmb);
		} else if (money.matches("\\d+.*")) {//直接翻译数字,例1234.5
			int decIndex = money.indexOf(".");
			if (decIndex == -1) {
				rsult.append(formatFractionalPart(Integer.valueOf(money),
						isEnglish));
			} else {
				int integ = Integer.valueOf(money.substring(0, decIndex));
				int dec = Integer.valueOf(money.substring(decIndex + 1));
				String point = isEnglish ? " point " : "点";
				rsult.append(formatFractionalPart(integ, isEnglish) + point
						+ formatFractionalPart(dec, isEnglish));
			}
		} else if (money.trim().matches("\\$\\d+.*")) {//翻译“$”开头的数字
			// String [] unit =
			// {"千","百","十","亿","千","百","十","万","千","百","十","美元"};
			if (isEnglish) {
				numToChinese(money, rsult, isEnglish);
				rsult.append(" dollar");
			} else {
				numToDolor(money, rsult);
				rsult.append("美元");
			}
		} else if (money.matches("¥\\d+.*")) {//翻译“¥”开头的数字
			numToChinese(money, rsult, isEnglish);
			if (isEnglish) {

				rsult.append(" yuan");
			}
		}

		return rsult.toString();
	}

	private static void numToDolor(String money, StringBuffer rsult) {
		String allNum = money.replace("$", "").replace(",", "");
		int decIndex = allNum.indexOf(".");
		if (decIndex == -1) {
			rsult.append(formatInteger(Integer.valueOf(allNum)));
		} else {
			int integ = Integer.valueOf(allNum.substring(0, decIndex));
			int dec = Integer.valueOf(allNum.substring(decIndex + 1));
			rsult.append(formatInteger(integ) + "点"
					+ formatFractionalPart(dec, false));
		}
	}

	private static void numToChinese(String money, StringBuffer rsult,
			boolean isEnglish) {
		if (isEnglish) {
			String allNum = money.replaceAll("[¥,$]", "");
			int decIndex = allNum.indexOf(".");
			if (decIndex == -1) {
				rsult.append(convert(Long.valueOf(allNum)));
			} else {
				int integ = Integer.valueOf(allNum.substring(0, decIndex));
				int dec = Integer.valueOf(allNum.substring(decIndex + 1));
				rsult.append(convert(integ)).append(" point ")
						.append(formatFractionalPart(dec, isEnglish));
			}
		} else {
			String unit = "千百十亿千百十万千百十元角分";
			String number = "零一二三四五六七八九";
			String allNum = money.replace("¥", "").replace(",", "");

			String moneyStr = String.format("%.2f", Double.valueOf(allNum))
					.replace(".", "");

			int pos = unit.length() - moneyStr.length();
			boolean zero = false;
			for (int i = 0; i < moneyStr.length(); i++) {
				if (moneyStr.charAt(i) == '0') {
					zero = true;
					if (((pos + i + 1) % 4) == 0) {
						rsult.append(unit.charAt(pos + i));
						zero = false;
					}
				} else {
					if (zero) {
						rsult.append(number.charAt(0));
					}
					zero = false;
					rsult.append(number.charAt(moneyStr.charAt(i) - '0'))
							.append(unit.charAt(pos + i));
				}
			}
			if (moneyStr.startsWith("0")) {
				rsult.deleteCharAt(0);
			}
		}
	}

	private static String formatInteger(int integ) {
		String[] unit = { "千", "百", "十", "亿", "千", "百", "十", "万", "千", "百",
				"十", "" };
		String numStr = "零一二三四五六七八九";
		String moneyStr = String.valueOf(integ);
		StringBuffer rsult = new StringBuffer();
		int pos = unit.length - moneyStr.length();
		boolean zero = false;
		for (int i = 0; i < moneyStr.length(); i++) {
			if (moneyStr.charAt(i) == '0') {
				zero = true;
				if (((pos + i + 1) % 4) == 0) {
					rsult.append(unit[pos + i]);
					zero = false;
				}
			} else {
				if (zero) {
					rsult.append(numStr.charAt(0));
				}
				zero = false;
				rsult.append(numStr.charAt(moneyStr.charAt(i) - '0')).append(
						unit[pos + i]);
			}
		}
		return rsult.toString();
	}

	public static String match(String money) throws Exception {
		String regEx = "";
		boolean isEnglish = true;
		if (money.matches(".*[\\u4E00-\\u9FBF&&[^¥]]+.*")) {
			isEnglish = false;

		}
		if (money.matches(".*[$¥][0-9,\\.]+[\\-][0-9,\\.]+.*")) {
			regEx = "([$¥][0-9,\\.]+[\\-][0-9,\\.]+)";
		} else if (money.matches(".*[$¥][0-9]+,.*")) {
			regEx = "(([\\$¥])(([1-9]\\d{0,2}(,\\d+)*(\\.\\d+)?)|[0]\\.\\d+))";
		} else if (money.matches(".*[$¥]\\d+.*")) {
			regEx = "(([\\$¥])([1-9]\\d*(\\.\\d+)?|0\\.\\d+))";
		} else if (money.matches(".*[^$¥]\\d+.*")) {
			regEx = "(([1-9]\\d*(\\.\\d{1,})?|0\\.\\d+))";
		}
		if ("".equals(regEx)) {
			return money;
		} else {
			// |([$¥]?[1-9]\\d*(.\\d+)*)
			money.matches(regEx);
			Pattern pattern = Pattern.compile(regEx);
			Matcher matcher = pattern.matcher(money);
			String num = "";
			if (matcher.find()) {
				num = matcher.group();
			}
			String numMoey = money.replace(num, translateMoney(num, isEnglish));
			// return numMoey;
			return match(numMoey);
		}
	}

	private static String convertLessThanOneThousand(int number) {
		String[] numNames = { "", " one", " two", " three", " four", " five",
				" six", " seven", " eight", " nine", " ten", " eleven",
				" twelve", " thirteen", " fourteen", " fifteen", " sixteen",
				" seventeen", " eighteen", " nineteen" };
		String[] tensNames = { "", " ten", " twenty", " thirty", " forty",
				" fifty", " sixty", " seventy", " eighty", " ninety" };
		String soFar;

		if (number % 100 < 20) {
			soFar = numNames[number % 100];
			number /= 100;
		} else {
			soFar = numNames[number % 10];
			number /= 10;

			soFar = tensNames[number % 10] + soFar;
			number /= 10;
		}
		if (number == 0)
			return soFar;
		if (!"".equals(numNames[number]) && !"".endsWith(soFar)) {
			soFar = " and" + soFar;
		}
		return numNames[number] + " hundred" + soFar;
	}

	public static String convert(long number) {
		// 0 to 999 999 999 999
		if (number == 0) {
			return "zero";
		}

		String snumber = Long.toString(number);

		// pad with "0"
		String mask = "000000000000";
		DecimalFormat df = new DecimalFormat(mask);
		snumber = df.format(number);

		// XXXnnnnnnnnn
		int billions = Integer.parseInt(snumber.substring(0, 3));
		// nnnXXXnnnnnn
		int millions = Integer.parseInt(snumber.substring(3, 6));
		// nnnnnnXXXnnn
		int hundredThousands = Integer.parseInt(snumber.substring(6, 9));
		// nnnnnnnnnXXX
		int thousands = Integer.parseInt(snumber.substring(9, 12));

		String tradBillions;
		switch (billions) {
		case 0:
			tradBillions = "";
			break;
		case 1:
			tradBillions = convertLessThanOneThousand(billions) + " billion ";
			break;
		default:
			tradBillions = convertLessThanOneThousand(billions) + " billion ";
		}
		String result = tradBillions;

		String tradMillions;
		switch (millions) {
		case 0:
			tradMillions = "";
			break;
		case 1:
			tradMillions = convertLessThanOneThousand(millions) + " million ";
			break;
		default:
			tradMillions = convertLessThanOneThousand(millions) + " million ";
		}
		result = result + tradMillions;

		String tradHundredThousands;
		switch (hundredThousands) {
		case 0:
			tradHundredThousands = "";
			break;
		case 1:
			tradHundredThousands = "one thousand ";
			break;
		default:
			tradHundredThousands = convertLessThanOneThousand(hundredThousands)
					+ " thousand ";
		}
		result = result + tradHundredThousands;

		String tradThousand;
		tradThousand = convertLessThanOneThousand(thousands);
		result = result + tradThousand;

		// remove extra spaces!
		return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " ");
	}
}



测试代码:

System.out.println(NumToChinese.match("尾号1234.5"));
System.out.println(NumToChinese.match("Number1234.5"));
System.out.println(NumToChinese.match("现金¥100"));
System.out.println(NumToChinese.match("现金$100 "));
System.out.println(NumToChinese.match("尾号1234的卡$100"));
System.out.println(NumToChinese.match("Money¥100"));
System.out.println(NumToChinese.match("Money $100"));
System.out.println(NumToChinese.match("Number 1234 money $100"));
System.out.println(NumToChinese.match("Money $100整"));
System.out.println(NumToChinese.match("现金¥100.12"));
System.out.println(NumToChinese.match("现金$100.12"));
System.out.println(NumToChinese.match("Money ¥100.12"));
System.out.println(NumToChinese.match("Money $100.12"));
System.out.println(NumToChinese.match("现金¥100-200"));
System.out.println(NumToChinese.match("现金¥100.1-200"));
System.out.println(NumToChinese.match("现金$100-200"));
System.out.println(NumToChinese.match("Money ¥100-200"));
System.out.println(NumToChinese.match("Money $100-200"));
System.out.println(NumToChinese.match("现金¥10,000"));
System.out.println(NumToChinese.match("现金$10,000"));
System.out.println(NumToChinese.match("Money ¥10,000"));
System.out.println(NumToChinese.match("Money $10,000"));


打印结果:

尾号一二三四点五
Number one two three four point  five
现金一百元
现金一百美元 
尾号一二三四的卡一百美元
Moneyone hundred yuan
Money one hundred dollar
Number  one two three four money one hundred dollar
Money 一百美元整
现金一百元一角二分
现金一百点一二美元
Money one hundred point  one two yuan
Money one hundred point  one two dollar
现金一百元到二百元
现金一百元一角到二百元
现金一百元到二百元美元
Money one hundred to two hundred yuan
Money one hundred to two hundred dollar
现金一万元
现金一万美元
Money ten thousand  yuan
Money ten thousand  dollar

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值