金额转换成大写

import java.text.DecimalFormat;
import java.util.Scanner;

/**  
 * @Description: 金额转换成大写
 * @author huangzjb
 * @mail cblue2013@126.com
 * @Company Digital China
 * @date 2015-1-30
 */

public class ChineseCurrency {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		System.out.println("请输入人民币金额:");
		
		while (true) {
			double number = s.nextDouble();
			if(number > 10000000000000000.0) 
				{
					System.out.println("金额太大,超出16位最大的整数!");
					continue;
				}
			System.out.println(toChineseCurrency(new Double(number)));
		}
	}

	public static String toChineseCurrency(Number number) {
		String targetNumber = new DecimalFormat("#.00").format(number);
		String result = "";
		
		targetNumber = targetNumber.replaceAll("\\.", "");
		char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
		String unit = "仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元角分";
		int unitLength = unit.length();
		StringBuffer unitSb = new StringBuffer(unit);
		StringBuffer resultSb = new StringBuffer(result);
		for (int i = targetNumber.length() - 1; i >= 0; i--){
			resultSb = unitSb.insert(unitLength - targetNumber.length() + i, digit[(targetNumber.charAt(i) - 0x30)]);//根据金额数字所在的位置,把它们对应的大写汉字和后面的单位('万仟佰拾...')拼接起来
		}
		
		result = resultSb.toString();
		//System.out.println((l + s.length() )== sb.length());
		
		result = result.substring(unitLength - targetNumber.length(), unitLength + targetNumber.length());//根据金额数字的长度,把前面超出范围的单位截掉(比如234.12,要把前面的'仟佰拾兆仟佰拾亿仟佰拾万仟'去掉..)
		//System.out.println(result);
		
		/*result = result.replaceAll("零[拾佰仟]", "零").replaceAll("零{2,}", "零")
		.replaceAll("零([兆亿万元])", "$1").replaceAll("零[角分]", "");*/
		
		result = result.replaceAll("零[拾佰仟]", "零")
		.replaceAll("零{2,}", "零")//有多个零连在一起,只取一个零
		.replaceAll("([拾佰仟])零([兆亿万])", "$1$2")//可以理解为把金额从低位到高位分为四组,每组四位,这一步是去除每一组(不全为零)末尾的零
		.replaceAll("零[兆亿万]", "")//处理四位数全为零的组
		.replaceAll("零元", "元"). replaceAll("零[角分]", "");
		
		if (result.endsWith("角"))
			result += "零分";
		if (!result.contains("角") && !result.contains("分") && result.contains("元"))
			result += "整";
		if (result.contains("分") && !result.contains("整") && !result.contains("角"))
			result = result.replace("元", "元零");
		return result;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值