import java.math.BigDecimal;public class Misc { //中文金额单位数组
final static String[] straChineseUnit = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
//中文数字字符数组(大写)
final static String[] straChineseNumber = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
//中文数字字符数组(小写)
final static String[] straChineseNumberSimple = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; /**
* Description 将数字金额转换为中文金额
* @param <p>BigDecimal bigdMoneyNumber 转换前的数字金额</P>
* @return String
调用:myToChineseCurrency("101.89")="壹佰零壹圆捌角玖分"
myToChineseCurrency("100.89")="壹佰零捌角玖分"
myToChineseCurrency("100")="壹佰圆整"
*/
private static String DoNumberCurrencyToChineseCurrency(BigDecimal bigdMoneyNumber,String[] ChineseNumber) {
String strChineseCurrency = "";
//零数位标记
boolean bZero = true;
//中文金额单位下标
int ChineseUnitIndex = 0; //DoPrintMessage("Calling Method DoNumberCurrencyToChineseCurrency"); try {
if (bigdMoneyNumber.doubleValue() == 0)
return "零元整"; //处理小数部分,四舍五入
double doubMoneyNumber = Math.round(bigdMoneyNumber.doubleValue() * 100); //是否负数
boolean bNegative = doubMoneyNumber < 0; //取绝对值
doubMoneyNumber = Math.abs(doubMoneyNumber); //循环处理转换操作
while (doubMoneyNumber > 0) {
//整的处理(无小数位)
if (ChineseUnitIndex == 2 && strChineseCurrency.length() == 0)
strChineseCurrency = strChineseCurrency + "整"; //非零数位的处理
if (doubMoneyNumber % 10 > 0) {
strChineseCurrency = ChineseNumber[(int)((long)doubMoneyNumber % 10)] + straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
bZero = false;
}
//零数位的处理
else {
//元的处理(个位)
if (ChineseUnitIndex == 2 ) {
//段中有数字
if (doubMoneyNumber > 0) {
strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
bZero = true;
}
}
//万、亿数位的处理
else if (ChineseUnitIndex == 6 || ChineseUnitIndex == 10) {
//段中有数字
if (doubMoneyNumber % 1000 > 0)
strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
} //前一数位非零的处理
if (!bZero)
strChineseCurrency = ChineseNumber[0] + strChineseCurrency; bZero = true;
} doubMoneyNumber = Math.floor(doubMoneyNumber / 10);
ChineseUnitIndex ++;
} //负数的处理
if (bNegative)
strChineseCurrency = "负" + strChineseCurrency;
}
catch (Exception e) {
//DoPrintMessage("Exception Reason : Call Method DoNumberCurrencyToChineseCurrency Error");
//DoPrintMessage("Exception Message : " + e.getMessage());
e.printStackTrace(); return "";
} return strChineseCurrency;
} /**
* 将金额数值转换成大写人民币形式
* @param n 金额数值
* @return String,大写人民币形式
*/
public static String CapitalMoney(double n) {
return DoNumberCurrencyToChineseCurrency(new BigDecimal(n), straChineseNumber);
}
public static void main(String[] args) {
double[] test_data={
17601432, //壹仟柒佰陆拾万壹仟肆佰叁拾贰元整
10001432 //壹仟万(零)壹仟肆佰叁拾贰元整
};
System.out.println(Misc.CapitalMoney(test_data[0]));
System.out.println(Misc.CapitalMoney(test_data[1]));
}
}控制台出的结果是:壹仟柒佰陆拾零万壹仟肆佰叁拾贰元整
壹仟零壹仟肆佰叁拾贰元整
能帮我找出错误的原因吗? 要怎么修改..
final static String[] straChineseUnit = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
//中文数字字符数组(大写)
final static String[] straChineseNumber = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
//中文数字字符数组(小写)
final static String[] straChineseNumberSimple = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; /**
* Description 将数字金额转换为中文金额
* @param <p>BigDecimal bigdMoneyNumber 转换前的数字金额</P>
* @return String
调用:myToChineseCurrency("101.89")="壹佰零壹圆捌角玖分"
myToChineseCurrency("100.89")="壹佰零捌角玖分"
myToChineseCurrency("100")="壹佰圆整"
*/
private static String DoNumberCurrencyToChineseCurrency(BigDecimal bigdMoneyNumber,String[] ChineseNumber) {
String strChineseCurrency = "";
//零数位标记
boolean bZero = true;
//中文金额单位下标
int ChineseUnitIndex = 0; //DoPrintMessage("Calling Method DoNumberCurrencyToChineseCurrency"); try {
if (bigdMoneyNumber.doubleValue() == 0)
return "零元整"; //处理小数部分,四舍五入
double doubMoneyNumber = Math.round(bigdMoneyNumber.doubleValue() * 100); //是否负数
boolean bNegative = doubMoneyNumber < 0; //取绝对值
doubMoneyNumber = Math.abs(doubMoneyNumber); //循环处理转换操作
while (doubMoneyNumber > 0) {
//整的处理(无小数位)
if (ChineseUnitIndex == 2 && strChineseCurrency.length() == 0)
strChineseCurrency = strChineseCurrency + "整"; //非零数位的处理
if (doubMoneyNumber % 10 > 0) {
strChineseCurrency = ChineseNumber[(int)((long)doubMoneyNumber % 10)] + straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
bZero = false;
}
//零数位的处理
else {
//元的处理(个位)
if (ChineseUnitIndex == 2 ) {
//段中有数字
if (doubMoneyNumber > 0) {
strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
bZero = true;
}
}
//万、亿数位的处理
else if (ChineseUnitIndex == 6 || ChineseUnitIndex == 10) {
//段中有数字
if (doubMoneyNumber % 1000 > 0)
strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
} //前一数位非零的处理
if (!bZero)
strChineseCurrency = ChineseNumber[0] + strChineseCurrency; bZero = true;
} doubMoneyNumber = Math.floor(doubMoneyNumber / 10);
ChineseUnitIndex ++;
} //负数的处理
if (bNegative)
strChineseCurrency = "负" + strChineseCurrency;
}
catch (Exception e) {
//DoPrintMessage("Exception Reason : Call Method DoNumberCurrencyToChineseCurrency Error");
//DoPrintMessage("Exception Message : " + e.getMessage());
e.printStackTrace(); return "";
} return strChineseCurrency;
} /**
* 将金额数值转换成大写人民币形式
* @param n 金额数值
* @return String,大写人民币形式
*/
public static String CapitalMoney(double n) {
return DoNumberCurrencyToChineseCurrency(new BigDecimal(n), straChineseNumber);
}
public static void main(String[] args) {
double[] test_data={
17601432, //壹仟柒佰陆拾万壹仟肆佰叁拾贰元整
10001432 //壹仟万(零)壹仟肆佰叁拾贰元整
};
System.out.println(Misc.CapitalMoney(test_data[0]));
System.out.println(Misc.CapitalMoney(test_data[1]));
}
}控制台出的结果是:壹仟柒佰陆拾零万壹仟肆佰叁拾贰元整
壹仟零壹仟肆佰叁拾贰元整
能帮我找出错误的原因吗? 要怎么修改..
//万、亿数位的处理
else if (ChineseUnitIndex == 6 || ChineseUnitIndex == 10) {
//段中有数字
if (doubMoneyNumber % 1000 > 0)
strChineseCurrency = straChineseUnit[ChineseUnitIndex] + strChineseCurrency;
}
copy代码跑了一下,把这个if (doubMoneyNumber % 1000 > 0)条件去掉条件中的语句保留,ChineseUnitIndex 等于6或10就表示段中有数字了。
import java.util.List;public class NumberToChange {
private final static String[] CN_Digits = { "零", "壹", "貳", "叁", "肆", "伍",
"陆", "柒", "捌", "玖", };
/**
* 将数字型货币转换为中文型货币 <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;//有过零
List<Boolean> lastZero = new ArrayList<Boolean>();
lastZero.add(new Boolean(false));
String curCN=null;
for(int i =0; i<cnt; i++){
partValue = int_value.substring(0,partLen);
int_value=int_value.substring(partLen);
String last = partValue.substring(partLen - 1);
curCN = Part2CN(partValue,i!=0&&!"零".equals(curCN), lastZero);
//检查当前的最后一位是否为零,如果是的话把lastZero设置为true
if(Integer.valueOf(last) == 0){
lastZero.add(new Boolean(true));
}else{
lastZero.add(new Boolean(false));
}
//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("整");
}
if(fv1 != 0){
cn_currency.append(CN_Digits[fv1]).append("角");
}else{
cn_currency.append("零");
}
if(fv2 != 0){
cn_currency.append(CN_Digits[fv2]).append("分");
}
}
return cn_currency.toString();
}
/**
* 将一组数字(不多于四个)转化成中文表示 <br/>
* 作者:penggl 时间:2011-12-01 下午07:41:25<br/>
* 参数:<br/>
* @param partValue 字符串形式的数字
* @param bInsertZero 是否在前面添加零
* @return
*/
private static String Part2CN(String partValue,boolean bInsertZero, List<Boolean> lastZero) {
//使用正则表达式,去除前面的0
partValue = partValue.replaceFirst("^0+", "");
int len = partValue.length();
if (len == 0)
return "零";
StringBuffer sbResult = new StringBuffer();
if(lastZero.remove(0).booleanValue()){
sbResult.append("零");
}
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 String replace(String s) {
if (s == null || s.isEmpty())
return "";
//万亿冗余去重,有先后顺序
if (s.contains("亿万"))
return s.replace("亿万", "亿");
else if (s.contains("亿零万"))
return s.replace("亿零万", "亿");
else if (s.contains("零万"))
return s.replace("零万", "万");
//测试了近10组数据,只想到这几种情况,如还有可再加
return s;
}计算结果时:System.out.println(replace(Misc.CapitalMoney(test_data[0])));