Java 金额转换 阿拉伯数字金额转换成汉字大写金额

本文提供两种Java实现方案,将阿拉伯数字金额转换为汉字大写金额,适用于财务系统中金额的显示需求。一种方案针对12位以内的金额,另一种则更灵活,能够处理包括小数在内的各种金额格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 金额转换 阿拉伯数字金额转换成汉字大写金额

  • 写的不是很完善,仅供参考!还望各大佬多多指点!下面直接上代码:
package demo;

import java.math.BigDecimal;
import java.util.Scanner;

public class MoneyToCN2 {
	
	private static final String CNSUM[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	private static final String SMALLSUM[] = {"分","角"};
	private static final String MIDSUM[] = {"","拾","佰","仟"};
	private static final String BIGSUM[] = {"","万 ","亿 "};
	
	private static final String YUAN = "圆";
	private static final String YUANZHENG = "圆整";
	private static final String LINGYUANZHENG = "零圆整";
	
	/**
	 * 默认精确到小数点后两位
	 */
	private static final int PRECISION = 2;
	
	/**
	 * 阿拉伯数字类型的金额 转换为 汉字大写金额类型
	 * @param strMoney 输入后经过四舍五入的金额(保留两位小数,保留位数可更改)
	 * @return 汉字大写金额
	 */
	public static String toCN(String strMoney){
		//用于接收转换了的汉字大写金额
		StringBuffer sb = new StringBuffer();
		
		String str[] = strMoney.split("\\.");  //根据小数点将金额分成两部分
		String strLeft = str[0];               //金额的整数部分
		String strRight = str[1];              //金额的小数部分
		
		/**
		 * 小数部分是否为零的情况
		 */
		if(Integer.parseInt(strRight)!=0){
			//小数部分不为零,先读小数部分的角、分情况
			
			int fen = Integer.parseInt(strRight.substring(1));
			int jiao = Integer.parseInt(strRight.substring(0,1));
			if(fen != 0){
				sb.insert(0,  SMALLSUM[0]);
				sb.insert(0, toUpperNumber(fen));
			}
			if(jiao != 0){
				sb.insert(0,  SMALLSUM[1]);
				sb.insert(0, toUpperNumber(jiao));
			}
			
			//如果整数部分不为零,先将“圆”添加上去
			if(Long.parseLong(strLeft)!=0){
				sb.insert(0, YUAN+" ");
			}
			
		}else{
			//小数部分为零,小数后面的部分忽略不读,即均为   “圆整” 情况
			sb.append(YUANZHENG);
			//如果整数部分也为零,那就是“零圆整”  0.00
			if(Long.parseLong(strLeft)==0){
				return LINGYUANZHENG;
			}
		}
		
		int leftLength = strLeft.length();    //整数部分的位数
		
		if(leftLength <= 4){
			//金额不超过上千的话
			
			MidToUpper(strLeft, sb);
			return sb.toString();
			
		}else{
			//金额上万起步的话
			
			//将整数部分的金额拆成4个长度为一组的数,第一组单位“”,第二组单位“万”,第三组单位“亿”
			//到底要分成几组?fenzu<=3
			int fenzu = 0;
			if(leftLength%4!=0){
				fenzu = leftLength/4+1;
			}else{
				fenzu = leftLength/4;
			}
			
			//整数部分拆分出来的小组都装进leftMoney数组中
			String leftMoney[] = new String[fenzu];
			
			//将左边的整数拆分成最多四位的数组
			for(int i=0; i<fenzu; i++){
				int indexBegin = leftLength-4*(i+1);    //开始切割的点
				//从后往前拆分
				if(indexBegin>0){
					leftMoney[i] = strLeft.substring(indexBegin, leftLength-4*i);
				}else{
					//indexBegin≤0,即将要切分的字符串已经不足4位
					leftMoney[i] = strLeft.substring(0, leftLength-4*i);
				}
			}
			
			//j<=2 进行小组阿拉伯金额转换成大写汉字金额
			for(int j=0; j<leftMoney.length; j++){
				if(!leftMoney[j].equals("0000")){
					sb.insert(0, BIGSUM[j]);
				}
				
				MidToUpper(leftMoney[j],sb);
			}
			
			return sb.toString();
		}

	}
	
	
	/**
	 * 将最多四位的金额转换成十百千的大写金额     如4181 -->肆仟壹佰捌拾壹
	 * @param str 整数金额的字符串形式(最高四位数)
	 * @param sb 转换后的大写金额
	 * @return 返回大写金额
	 */
	public static String MidToUpper(String str, StringBuffer sb){
		
		if(str == null || str.trim().length() == 0){
			return "";
		}
		
		int strLength = str.length();
		
		for(int i=0; i<strLength; i++){
			int sum = Integer.parseInt(str.substring(strLength-i-1,strLength-i));
			if(sum!=0){
				sb.insert(0, MIDSUM[i]);
				sb.insert(0, toUpperNumber(sum));
			}
		}
		
		return sb.toString();
	}
	
	/**
	 * 阿拉伯数字转换成汉字大写
	 * @param num 阿拉伯数字 1~9
	 * @return 返回汉字大写 壹~玖
	 */
	public static String toUpperNumber(int num){
		if(num>=0 && num<=9){
			return CNSUM[num];
		}
		return "";
	}
	
	
	public static void main(String[] args) {
		while(true){
			System.out.print("1.请输入最高整数为12位的金额:");
			BigDecimal money = new Scanner(System.in).nextBigDecimal();
			
	        String strMoney = money.setScale(PRECISION, BigDecimal.ROUND_HALF_UP).toString();
			System.out.println("2.输入的金额保留两位小数后为:" + strMoney);
			
			if(strMoney.length()>15){
				System.out.println("3.抱歉,本小宝无法转换超过 上千亿 的金额!");
				
			}else{
				System.out.println("3.将其转换成汉字大写金额后为:" + toCN(strMoney));
			}
			
			System.out.println();
			
		}
		
	}

}

其他版本:

package demo;

/**
 * 数字货币转换成汉字大写人民币 ¥100,203.20 --→ 拾万零贰佰零弎元贰角
 * 
 * @author LaoYiPing
 * 
 */
public class MoneyToCN {

	private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
	private static final String[] BIG_POS = { "", "万", "亿" };
	private static final String[] SMALL_POS = { "", "拾", "佰", "仟" };
	private static final String[] UNITS = { "角", "分", "厘" };
	private static final String YUAN = "圆";
	private static final String YUAN_ZHENG = "圆整";
	private static final String[] SMALL_O = { "零仟", "零佰", "零拾" };
	private static final String[] BIG_O = { "零亿", "零万", "零圆" };
	private static final String[] BIG_T = { "亿", "万", "圆" };
	private static final String BILL = "亿";
	private static final String ZERO = "零";
	private static final String DOUBLE_ZERO = "零零";

	public static void main(String[] args) {
		System.out.println(toCurrency("100000000001.00"));
	}

	public static String toCurrency(String d) {
		if (d == null) {
			return "";
		}
		String s = null;
		String high = null;
		String low = null;
		d = d.trim();
		d = d.replaceAll("\\s+", "");
		if (d.contains(".")) {
			high = d.substring(0, d.indexOf("."));
			low = d.substring(d.indexOf(".") + 1);
		} else {
			high = d;
		}
		high = toHigh(high);
		low = toLow(low);
		if (!isEmpty(low) && !isEmpty(high)) {
			s = high + YUAN + low;
		} else if (!isEmpty(high) && isEmpty(low)) {
			s = high + YUAN_ZHENG;
		} else if (isEmpty(high) && !isEmpty(low)) {
			while (true) {
				if (low.startsWith(NUMBERS[0])) {
					low = low.substring(2);
				} else {
					break;
				}
			}
			s = low;
		}
		return s;
	}

	private static String toHigh(String high) {
		if (high == null) {
			return null;
		}
		high = high.trim();
		if (high.length() < 10 && Integer.parseInt(high) == 0) {
			return null;
		}
		StringBuffer data = new StringBuffer(high);
		//everse()方法表示的是将一个输入流倒叙输出。
		data = data.reverse();
		high = data.toString();
		boolean b = false;
		boolean m = false;
		boolean f = false;
		StringBuffer rs = new StringBuffer();
		if (high.length() > 8) {
			String[] billions = getBillions(high);
			for (int i = 0; i < billions.length; i++) {
				if (isEmpty(billions[i])) {
					break;
				}
				if (i > 0) {
					b = true;
				}
				if (b) {
					rs.append(BILL);
				}
				if (m && f) {
					rs.append(BILL);
				}
				String[] millions = getMillions(billions[i]);
				if (millions != null) {
					for (int j = 0; j < millions.length; j++) {
						if (isEmpty(millions[j])) {
							break;
						}
						if (b && j > 0) {
							m = true;
						}
						if (Integer.parseInt(millions[j]) == 0) {
							f = false;
							continue;
						} else {
							f = true;
						}
						if (b && m) {
							rs.append(BILL);
						}
						rs.append(BIG_POS[j]);
						for (int n = 0; n < millions[j].length(); n++) {
							rs.append(SMALL_POS[n]).append(
									NUMBERS[Integer.parseInt(millions[j]
											.charAt(n) + "")]);
						}
					}
				} else {
					for (int n = 0; n < billions[i].length(); n++) {
						rs.append(SMALL_POS[n]).append(
								NUMBERS[Integer.parseInt(billions[i].charAt(n)
										+ "")]);
					}
				}
			}
		} else if (high.length() > 4) {
			String[] millions = getMillions(high);
			for (int j = 0; j < millions.length; j++) {
				if (isEmpty(millions[j])) {
					break;
				}
				rs.append(BIG_POS[j]);
				for (int n = 0; n < millions[j].length(); n++) {
					rs.append(SMALL_POS[n])
							.append(NUMBERS[Integer.parseInt(millions[j]
									.charAt(n) + "")]);
				}
			}
		} else {
			for (int n = 0; n < high.length(); n++) {
				rs.append(SMALL_POS[n]).append(
						NUMBERS[Integer.parseInt(high.charAt(n) + "")]);
			}
		}
		rs = rs.reverse();
		return getResult(rs.toString());
	}

	private static String getResult(String s) {
		int l = s.length();
		if (s == null) {
			return null;
		}
		for (int i = 0; i < SMALL_O.length; i++) {
			s = s.replaceAll(SMALL_O[i], ZERO);
		}
		s = s.replaceAll(DOUBLE_ZERO, ZERO);
		for (int i = 0; i < BIG_O.length; i++) {
			s = s.replaceAll(BIG_O[i], BIG_T[i]);
		}
		if (l != s.length()) {
			s = getResult(s);
		}
		return s;
	}

	private static String[] getMillions(String high) {
		if (high.length() > 4) {
			int l = high.length() / 4 + 1;
			String[] billions = new String[l];
			int index = 0;
			int st = 0;
			int en = 4;
			while (true) {
				if (high.length() > 4) {
					billions[index] = high.substring(st, en);
					high = high.substring(en);
				} else {
					billions[index] = high;
					break;
				}
				index++;
			}
			return billions;
		}
		return null;
	}

	private static boolean isEmpty(String s) {
		return s == null || "".equals(s.trim());
	}

	private static String[] getBillions(String high) {
		if (high.length() > 8) {
			int l = high.length() / 8 + 1;
			String[] billions = new String[l];
			int index = 0;
			int st = 0;
			int en = 8;
			while (true) {
				if (high.length() > 8) {
					billions[index] = high.substring(st, en);
					high = high.substring(en);
				} else {
					billions[index] = high;
					break;
				}
				index++;
			}
			return billions;
		}
		return null;
	}

	private static String toLow(String low) {
		if (low == null) {
			return null;
		}
		StringBuffer rs = new StringBuffer();
		for (int i = 0; i < low.length(); i++) {
			rs.append(NUMBERS[Integer.parseInt(low.charAt(i) + "")]).append(UNITS[i]);
		}
		return rs.toString();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值