`

数字转换为汉语中人民币的大写(转载)

 
阅读更多
java转换一:
package dataDemo;


import java.math.BigDecimal;

/**
 * 数字转换为汉语中人民币的大写
 */
public class NumberToCN {
    /**
     * 汉语中数字大写
     */
    private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆",
            "伍", "陆", "柒", "捌", "玖" };
    /**
     * 汉语中货币单位大写,这样的设计类似于占位符
     */
    private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元",
            "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾",
            "佰", "仟" };
    /**
     * 特殊字符:整
     */
    private static final String CN_FULL = "整";
    /**
     * 特殊字符:负
     */
    private static final String CN_NEGATIVE = "负";
    /**
     * 金额的精度,默认值为2
     */
    private static final int MONEY_PRECISION = 2;
    /**
     * 特殊字符:零元整
     */
    private static final String CN_ZEOR_FULL = "零元" + CN_FULL;

    /**
     * 把输入的金额转换为汉语中人民币的大写
     * 
     * @param numberOfMoney
     *            输入的金额
     * @return 对应的汉语大写
     */
    public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {
        StringBuffer sb = new StringBuffer();
        // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or
        // positive.
        int signum = numberOfMoney.signum();
        // 零元整的情况
        if (signum == 0) {
            return CN_ZEOR_FULL;
        }
        //这里会进行金额的四舍五入
        long number = numberOfMoney.movePointRight(MONEY_PRECISION)
                .setScale(0, 4).abs().longValue();
        // 得到小数点后两位值
        long scale = number % 100;
        int numUnit = 0;
        int numIndex = 0;
        boolean getZero = false;
        // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
        if (!(scale > 0)) {
            numIndex = 2;
            number = number / 100;
            getZero = true;
        }
        if ((scale > 0) && (!(scale % 10 > 0))) {
            numIndex = 1;
            number = number / 10;
            getZero = true;
        }
        int zeroSize = 0;
        while (true) {
            if (number <= 0) {
                break;
            }
            // 每次获取到最后一个数
            numUnit = (int) (number % 10);
            if (numUnit > 0) {
                if ((numIndex == 9) && (zeroSize >= 3)) {
                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
                }
                if ((numIndex == 13) && (zeroSize >= 3)) {
                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
                }
                sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
                sb.insert(0, CN_UPPER_NUMBER[numUnit]);
                getZero = false;
                zeroSize = 0;
            } else {
                ++zeroSize;
                if (!(getZero)) {
                    sb.insert(0, CN_UPPER_NUMBER[numUnit]);
                }
                if (numIndex == 2) {
                    if (number > 0) {
                        sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
                    }
                } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {
                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
                }
                getZero = true;
            }
            // 让number每次都去掉最后一个数
            number = number / 10;
            ++numIndex;
        }
        // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
        if (signum == -1) {
            sb.insert(0, CN_NEGATIVE);
        }
        // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
        if (!(scale > 0)) {
            sb.append(CN_FULL);
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        double money = 2020004.01;
        BigDecimal numberOfMoney = new BigDecimal(money);
        String s = NumberToCN.number2CNMontrayUnit(numberOfMoney);
        System.out.println("你输入的金额为:【"+ money +"】   #--# [" +s.toString()+"]");
    }
}


js转换:
function cmycurd(num){  //转成人民币大写金额形式 

  var str1 = '零壹贰叁肆伍陆柒捌玖';  //0-9所对应的汉字 

  var str2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'; //数字位所对应的汉字 

  var str3;    //从原num值中取出的值 

  var str4;    //数字的字符串形式 

  var str5 = '';  //人民币大写金额形式 

  var i;    //循环变量 

  var j;    //num的值乘以100的字符串长度 function cmycurd(num){  //转成人民币大写金额形式 

  var str1 = '零壹贰叁肆伍陆柒捌玖';  //0-9所对应的汉字 

  var str2 = '万仟佰拾亿仟佰拾万仟佰拾元角分'; //数字位所对应的汉字 

  var str3;    //从原num值中取出的值 

  var str4;    //数字的字符串形式 

  var str5 = '';  //人民币大写金额形式 

  var i;    //循环变量 

  var j;    //num的值乘以100的字符串长度 

  var ch1;    //数字的汉语读法 

  var ch2;    //数字位的汉字读法 

  var nzero = 0;  //用来计算连续的零值是几个 

  

  num = Math.abs(num).toFixed(2);  //将num取绝对值并四舍五入取2位小数 

  str4 = (num * 100).toFixed(0).toString();  //将num乘100并转换成字符串形式 

  j = str4.length;      //找出最高位 

  if (j &gt; 15){return '溢出';} 

  str2 = str2.substr(15-j);    //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分 

  

  //循环取出每一位需要转换的值 

  for(i=0;i= 3){ 

            ch1 = ''; 

            ch2 = ''; 

            nzero = nzero + 1; 

       } 

       else{ 

      if (j &gt;= 11){ 

              ch1 = ''; 

              nzero = nzero + 1; 

   } 

   else{ 

     ch1 = ''; 

     ch2 = str2.substr(i,1); 

     nzero = nzero + 1; 

   } 

          } 

  } 

   } 

} 

    if (i == (j-11) || i == (j-3)){  //如果该位是亿位或元位,则必须写上 

        ch2 = str2.substr(i,1); 

    } 

    str5 = str5 + ch1 + ch2; 

    

    if (i == j-1 &amp;&amp; str3 == '0' ){   //最后一位(分)为0时,加上“整” 

      str5 = str5 + '整'; 

    } 

  } 

  if (num == 0){ 

    str5 = '零元整'; 

  } 

//  alert(str5)

  return str5; 

}

  var ch1;    //数字的汉语读法 

  var ch2;    //数字位的汉字读法 

  var nzero = 0;  //用来计算连续的零值是几个 

  

  num = Math.abs(num).toFixed(2);  //将num取绝对值并四舍五入取2位小数 

  str4 = (num * 100).toFixed(0).toString();  //将num乘100并转换成字符串形式 

  j = str4.length;      //找出最高位 

  if (j &gt; 15){return '溢出';} 

  str2 = str2.substr(15-j);    //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分 

  

  //循环取出每一位需要转换的值 

  for(i=0;i= 3){ 

            ch1 = ''; 

            ch2 = ''; 

            nzero = nzero + 1; 

       } 

       else{ 

      if (j &gt;= 11){ 

              ch1 = ''; 

              nzero = nzero + 1; 

   } 

   else{ 

     ch1 = ''; 

     ch2 = str2.substr(i,1); 

     nzero = nzero + 1; 

   } 

          } 

  } 

   } 

} 

    if (i == (j-11) || i == (j-3)){  //如果该位是亿位或元位,则必须写上 

        ch2 = str2.substr(i,1); 

    } 

    str5 = str5 + ch1 + ch2; 

    

    if (i == j-1 &amp;&amp; str3 == '0' ){   //最后一位(分)为0时,加上“整” 

      str5 = str5 + '整'; 

    } 

  } 

  if (num == 0){ 

    str5 = '零元整'; 

  } 

//  alert(str5)

  return str5; 

}

java转换二:
package com.sst.numToChina;

public class NumToBig {
	public static String changeToBig(double value) {
		  char[] hunit = { '拾', '佰', '仟' };// 段内位置表示 
		  char[] vunit = { '万', '亿' }; // 段名表示 
		  char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示 
		  long midVal = (long) (value * 100); // 转化成整形 
		  String valStr = String.valueOf(midVal); // 转化成字符串 
		  String head = valStr.substring(0, valStr.length() - 2); // 取整数部分 
		  String rail = valStr.substring(valStr.length() - 2); // 取小数部分
		  String prefix = ""; // 整数部分转化的结果 
		  String suffix = ""; // 小数部分转化的结果
		  
		  if(valStr.length()>17)
		  {
		      return "数值过大!";//解决问题1,超过千亿的问题。
		  }
		  
		  
		  // 处理小数点后面的数 
		  if (rail.equals("00")) { // 如果小数部分为0 
		   suffix = "整";
		  } else {
		   suffix = digit[rail.charAt(0) - '0'] + "角"
		     + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来 
		  }
		  // 处理小数点前面的数 
		  char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组 
		  char zero = '0'; // 标志'0'表示出现过0 
		  byte zeroSerNum = 0; // 连续出现0的次数 
		  for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字 
		   int idx = (chDig.length - i - 1) % 4; // 取段内位置 
		   int vidx = (chDig.length - i - 1) / 4; // 取段位置 
		   if (chDig[i] == '0') { // 如果当前字符是0 
		    zeroSerNum++; // 连续0次数递增 
		    if (zero == '0' && idx!=0) { // 标志 ,连续零,仅读一次零,
		     zero = digit[0];   //解决问题2,当一个零位于第0位时,不输出“零”,仅输出“段名”.
		    } else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
		     prefix += vunit[vidx - 1];
		     zero = '0';
		    }
		    continue;
		   }
		   zeroSerNum = 0; // 连续0次数清零 
		   if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的 
		    prefix += zero;
		    zero = '0';
		   }
		   //取到该位对应数组第几位。
		   int position=chDig[i] - '0';   
		   if(position==1 && i==0 && idx==1)//解决问题3 ,即处理10读"拾",而不读"壹拾"
		   {
		   }else{
		       prefix += digit[position]; // 转化该数字表示 
		   }
		   
		   if (idx > 0)      // 段内位置表示的值
		    prefix += hunit[idx - 1];
		   if (idx == 0 && vidx > 0) {      // 段名表示的值 
		    prefix += vunit[vidx - 1];   // 段结束位置应该加上段名如万,亿 
		   }
		  }
		  if (prefix.length() > 0)
		   prefix += '圆'; // 如果整数部分存在,则有圆的字样 
		  return prefix + suffix; // 返回正确表示 
		 }
		 public static void main(String[] args) {
		  String tmp = changeToBig(2340912.23);
		  System.out.println(tmp);
		  tmp = changeToBig(2071234.00);
		  System.out.println(tmp);
		  tmp = changeToBig(100234.00);
		  System.out.println(tmp);
		  tmp = changeToBig(100000.00);
		  System.out.println(tmp);
		  tmp = changeToBig(10000000.00);
		  System.out.println(tmp);
		 }
}

java转换三:
package com.sst.numToChina;

public class Num2Rmb {   
    private String[] hanArr = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌",   
            "玖" };   
    private String[] unitArr = { "拾", "佰", "仟" };   
    private String[] unitBigArr = { "万", "亿" };   
    private String[] pointArr = { "角", "分" };   
  
    /**  
     * 转中文输出  
     * www.blogguy.cn  
     * @param args  
     */  
  
    private String toHanArr(String numStr) {   
        String result = "";   
        int numberLen = numStr.length();   
        int numberBit = 0;   
  
        if (numberLen > 14) {   
            return "不能转换大于万亿(14位)以上的数字";   
        }   
        // 4个数字为一节,先计算一共有几节   
        int numPart = numberLen % 4 == 0 ? numberLen / 4 : numberLen / 4 + 1;   
        // 第一节有几位   
        // 54,8545,8454 则第一节只有两位   
        int firstNumpart = numberLen - (numPart - 1) * 4;   
        // 构造一个数组,存储每一节的数据   
        String[] numPartArr = new String[numPart];   
        int index= -1;   
        for (int j = 0; j < numPartArr.length; j++) {   
            numPartArr[j] = "";   
            if (j == 0) {   
                // 第一组   
                numPartArr[j] += numStr.substring(0, firstNumpart);   
            } else {   
                // 不是第一组数字,应该是4位   
                numPartArr[j] += numStr.substring(firstNumpart + (j - 1) * 4,   
                        firstNumpart + j * 4);   
            }   
            //转换为中文   
            for (int i = 0; i < numPartArr[j].length(); i++) {   
                int num = numPartArr[j].charAt(i) - 48;   
                int numPartLength = numPartArr[j].length();   
                if (i != numPartLength - 1 && num != 0) {   
                    result += hanArr[num] + unitArr[numPartLength - 2 - i ];   
                } else {   
                    result += hanArr[num];   
                }   
            }   
               
            if(numPartArr.length==2&&j==0){   
                result += unitBigArr[0];   
            }   
            if(numPartArr.length==3&&j==0){   
                result += unitBigArr[1];   
            }      
            if(numPartArr.length==3&&j==1){   
                result += unitBigArr[0];   
            }                  
        }   
        return result;   
    }   
  
    public static void main(String args[]) {   
        Num2Rmb nr = new Num2Rmb();   
        System.out.println(nr.toHanArr("95852801421"));   
    }   
  
}  

java转换四:
package com.sst.numToChina;

public class MoneyUtil {
	private final static String[] CN_Digits = { "零", "壹", "貳", "叁", "肆", "伍",
			"陆", "柒", "捌", "玖", };

	/**
	 * 将数字型货币转换为中文型货币 <br/>
	 * 作者:wallimn 时间:2009-4-10 下午09:59:26<br/>
	 * 博客:http://blog.csdn.net/wallimn<br/>
	 * 参数:<br/>
	 * 
	 * @param moneyValue
	 *             字符串形式的金额,小数部分,将多于3位部分舍去,不做四舍五入
	 * @return
	 */
	public static String CNValueOf(String moneyValue) {
		//使用正则表达式,去除前面的零及数字中的逗号
		String value = moneyValue.replaceFirst("^0+", "");
		value = value.replaceAll(",", "");
		//分割小数部分与整数部分
		int dot_pos = value.indexOf('.');
		String int_value;
		String fraction_value;
		if (dot_pos == -1) {
			int_value = value;
			fraction_value = "00";
		} else {
			int_value = value.substring(0, dot_pos);
			fraction_value = value.substring(dot_pos + 1, value.length())
					+ "00".substring(0, 2);//也加两个0,便于后面统一处理
		}

		int len = int_value.length();
		if (len>16) return "值过大";
		StringBuffer cn_currency = new StringBuffer();
		String[] CN_Carry = new String[] { "", "万", "亿", "万" };
		//数字分组处理,计数组数
		int cnt = len/4+(len%4==0?0:1);
		//左边第一组的长度
		int partLen = len-(cnt-1)*4;
		String partValue=null;
		boolean bZero=false;//有过零
		String curCN=null;
		for(int i =0; i<cnt; i++){
			partValue = int_value.substring(0,partLen);
			int_value=int_value.substring(partLen);
			curCN = Part2CN(partValue,i!=0&&!"零".equals(curCN));
			//System.out.println(partValue+":"+curCN);
			//若上次为零,这次不为零,则加入零			
			if(bZero && !"零".equals(curCN)){
				cn_currency.append("零");
				bZero=false;
			}
			if("零".equals(curCN))bZero=true;
			//若数字不是零,加入中文数字及单位
			if(!"零".equals(curCN)){
				cn_currency.append(curCN);
				cn_currency.append(CN_Carry[cnt-1-i]);
			}
			//除最左边一组长度不定外,其它长度都为4
			partLen=4;
			partValue=null;
		}
		cn_currency.append("元");
		//处理小数部分
		int fv1 = Integer.parseInt(fraction_value.substring(0,1));
		int fv2 = Integer.parseInt(fraction_value.substring(1,2));
		if(fv1+fv2==0){
			cn_currency.append("整");
		}
		else{
			cn_currency.append(CN_Digits[fv1]).append("角");
			cn_currency.append(CN_Digits[fv2]).append("分");
		}
		return cn_currency.toString();
	}

	/**
	 * 将一组数字(不多于四个)转化成中文表示 <br/>
	 * 作者:wallimn 时间:2009-4-11 下午07:41:25<br/>
	 * 博客:http://wallimn.iteye.com<br/>
	 * 参数:<br/>
	 * 
	 * @param partValue 字符串形式的数字
	 * @param bInsertZero 是否在前面添加零
	 * @return
	 */
	private static String Part2CN(String partValue,boolean bInsertZero) {
		//使用正则表达式,去除前面的0
		partValue = partValue.replaceFirst("^0+", "");
		int len = partValue.length();
		if (len == 0)
			return "零";
		StringBuffer sbResult = new StringBuffer();
		int digit;
		String[] CN_Carry = new String[] { "", "拾", "佰", "仟" };
		for (int i = 0; i < len; i++) {
			digit = Integer.parseInt(partValue.substring(i, i + 1));
			if (digit != 0) {
				sbResult.append(CN_Digits[digit]);
				sbResult.append(CN_Carry[len - 1 - i]);
			} else {
				// 若不是最后一位,且下不位不为零,追加零
				if (i != len - 1
						&& Integer.parseInt(partValue.substring(i + 1, i + 2)) != 0)
					sbResult.append("零");
			}
		}
		if(bInsertZero && len!=4)sbResult.insert(0, "零");
		return sbResult.toString();
	}
	
	
	 public static void main(String args[]) {   
//	        Num2Rmb nr = new Num2Rmb();   
	        System.out.println(CNValueOf("95852801421"));   
	    }  
}

java转换五:
package com.sst.numToChina;

import java.text.DecimalFormat;

public class Test { 
	private static final String digit_0 = "零壹贰叁肆伍陆柒捌玖"; 
	private static final String digit_1 = "零一二三四五六七八九"; 
	private static final String[] digit_2 = { "", "十", "百", "千" }; 
	private static final String[] digit_3 = { "", "拾", "佰", "仟" }; 
	private static final String[] digit_4 = { "", "万", "亿", "万亿", "亿亿" }; 


	/** 
	* @param args 
	*/ 
	public static void main(String[] args) { 
	System.out.println(changeDigit("2012.12", false)); 
	System.out.println(changeDigit("210.12", true)); 
	System.out.println(changeNumberRMB(210.12)); 
	} 


	/** 
	* Description: 数字转化成整数 
	* @param str 
	* @param bo 
	* @return 
	*/ 
	public static String changeDigit(String str, boolean bo) { 
	StringBuffer strbu = new StringBuffer(); 
	int dou = str.indexOf("."); 
	// :判断是否为小数还是整数,长度小于零为整数 
	if (dou < 0) { 
	dou = str.length(); 
	} 
	// :获取整数部分 
	String inter = str.substring(0, dou); 
	strbu.append(changeInteger(Long.parseLong(inter), bo)); 
	// :处理小数部分 
	if (dou != str.length()) { 
	strbu.append("点"); 
	// :获取小数点后所有数 
	String xh = str.substring(dou + 1); 
	for (int i = 0; i < xh.length(); i++) { 
	if (bo) { 
	strbu.append(digit_0.charAt(Integer.parseInt(xh.substring( 
	i, i + 1)))); 
	} else { 
	strbu.append(digit_1.charAt(Integer.parseInt(xh.substring( 
	i, i + 1)))); 
	} 
	} 
	} 
	String strs = strbu.toString(); 
	// :处理特殊情况,可能不全 
	if (strs.startsWith("零")) { 
	strs = strs.substring(1); 
	} 
	if (strs.startsWith("一十")) { 
	strs = strs.substring(1); 
	} 
	while (strs.endsWith("零")) { 
	strs = strs.substring(0, strs.length() - 1); 
	} 
	if (strs.startsWith("点")) { 
	strs = "零" + strs; 
	} 
	if (strs.endsWith("点")) { 
	strs = strs.substring(0, strs.length() - 1); 
	} 
	return strs; 
	} 


	/** 
	* 位数小于4时,调用处理数据 
	*  
	* @param str 
	* @param bo 
	* @return 
	*/ 
	public static String readNumber(String str, boolean bo) { 
	StringBuffer strbu = new StringBuffer(); 
	if (str.length() != 4) { 
	return null; 
	} 
	for (int i = 0; i < 4; i++) { 
	char ch = str.charAt(i); 
	if (ch == '0' && i > 1 && str.charAt(i - 1) == '0') { 
	continue; 
	} 
	if (ch != '0' && i > 1 && str.charAt(i - 1) == '0') { 
	strbu.append('零'); 
	} 
	if (ch != '0') { 
	if (bo) { 
	strbu.append(digit_0.charAt(ch - 48)); 
	strbu.append(digit_3[4 - i - 1]); 
	} else { 
	strbu.append(digit_1.charAt(ch - 48)); 
	strbu.append(digit_2[4 - i - 1]); 
	} 
	} 
	} 
	return strbu.toString(); 
	} 


	/** 
	* 整数部分转换大写 
	*  
	* @param lon 
	* @param bo 
	* @return 
	*/ 
	public static String changeInteger(long lon, boolean bo) { 
	StringBuffer strbu = new StringBuffer(); 
	// :增加3位数,为了完成大写转换 
	String strN = "000" + lon; 
	int strN_L = strN.length() / 4; 
	// :根据不同的位数长度,消除strN"0"的个数 
	strN = strN.substring(strN.length() - strN_L * 4); 
	for (int i = 0; i < strN_L; i++) { 
	String s1 = strN.substring(i * 4, i * 4 + 4); 
	String s2 = readNumber(s1, bo); 
	strbu.append(s2); 
	if (s2.length() != 0) { 
	strbu.append(digit_4[strN_L - i - 1]); 
	} 
	} 
	String s = new String(strbu); 
	if (s.length() != 0 && s.startsWith("零")) 
	s = s.substring(1); 
	return s; 
	} 


	/** 
	* 人名币输出格式 
	*  
	* @param rmb 
	* @return 
	*/ 
	public static String changeNumberRMB(double rmb) { 
	String strRMB = "" + rmb; 
	DecimalFormat df = new DecimalFormat("#.#"); 
	df.setMaximumFractionDigits(2); 
	strRMB = df.format(rmb).toString(); 
	// :true人民币大写,并返回数据 
	strRMB = changeDigit(strRMB, true); 
	if (strRMB.indexOf("点") >= 0) { 
	strRMB = strRMB + "零"; 
	strRMB = strRMB.replaceAll("点", "圆"); 
	String str1 = strRMB.substring(0, strRMB.indexOf("圆") + 1); 
	String str2 = strRMB.substring(strRMB.indexOf("圆") + 1); 
	strRMB = str1 + str2.charAt(0) + "角" + str2.charAt(1) + "分整"; 
	} else { 
	strRMB = strRMB + "圆整"; 
	} 
	return "人民币(大写):" + strRMB; 
	} 
	} 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics