将金额转换为中文大写

将金额转换为中文大写
思路
  1. 判断符号,0则直接返回
  2. 数字去掉点
  3. 00结尾的要加’整’
  4. 循环,从后面每次取一个数位上的值直到最前面,
  5. 若是非零则加上对应的数值和单位
  6. 若是零,判断上一个是否为零,是,则不加’零’,若是个位上的需要加’‘元’若是万,亿,兆则要加上’万,亿,兆’,要排除出现’亿万和兆亿’(数值除以10000)
package com.szhiiso.fomp.common.utils;

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

import javax.swing.plaf.ViewportUI;

import org.apache.xalan.templates.ElemAttributeSet;
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
import org.junit.Test;

import com.sun.media.jai.iterator.RectIterCSM;

/**
 * 数据处理
 * 
 * @author hwq
 * @date 2018年10月10日
 */
public class MyDigitUtils {

	private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

	private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
			"佰", "仟", "兆", "拾", "佰", "仟" };
	/**
	 * 将金额转换为大写中文
	 * 
	 * @param money
	 * @return
	 */
	public static String number2CNMoneyUnit(double money) {
		StringBuffer sbBuffer = new StringBuffer();
		BigDecimal bigDecimalMoney = BigDecimal.valueOf(money);
		int signum = bigDecimalMoney.signum();
		if (signum == 0) {
			return "零元整";
		}
		long number = bigDecimalMoney.setScale(2, BigDecimal.ROUND_HALF_UP).abs().movePointRight(2).longValue();

		int numIndex = 0;
		int numUnit = 0;

		boolean getZero = false;
		if (number % 100 == 0) {
			sbBuffer.append("整");
			number=number/100;
			numIndex = 2;
			getZero = true;
		} 
		while (true) {
			if (number == 0) {
				break;
			}
			numUnit = (int) (number % 10);
			if (numUnit == 0) {
				if (getZero) {
					if (numIndex == 2) {
						sbBuffer.insert(0, "元");
					} else if ((numIndex - 2) % 4 == 0 && number % 10000 != 0) {
						sbBuffer.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);

					}
					
				}else {
				if(numIndex!=0){//最后一位不加零
					sbBuffer.insert(0, "零");
				}
				getZero = true;
			} else {
				sbBuffer.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
				sbBuffer.insert(0, CN_UPPER_NUMBER[numUnit]);
				getZero = false;
			}
			number = number / 10;
			numIndex++;

		}
		if (signum < 0) {
			sbBuffer.insert(0, "负");
		}

		return sbBuffer.toString();
	}
}


测试

	public static void main(String[] args) {
		   Random random=new Random();
		   for(int i=0;i<50;i++) {
			   double nextDouble = random.nextDouble()*Math.pow(10,CN_UPPER_MONETRAY_UNIT.length-5);
			   System.out.print(BigDecimal.valueOf(nextDouble)+"----");
				System.out.println(MyDigitUtils.number2CNMoneyUnit(nextDouble));
		   }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值