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

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 > 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 >= 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 && 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 > 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 >= 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 && 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;
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值