帮我看一下数字转换成中文的问题
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]));
}
}
控制台出的结果是:壹仟柒佰陆拾零万壹仟肆佰叁拾贰元整
壹仟零壹仟肆佰叁拾贰元整
能帮我找出错误的原因吗? 要怎么修改..
[解决办法]
今天抽空看了一下,原计算逻辑应该没问题的,if判断保留,再新增一个方法
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; }