人民币小写金额转大写金额(java版)
代码说明:
1.最大支持百万亿(15位整数,2位小数) ;或仟万亿(16位整数)
2. 超过最大支持仟万亿(16位整数),只输出大写数字
3. 整数部分越大,则小数部分输出越不精确
4. 负数,则忽略负号
代码:
1.原代码
import DecimalFormat;
/**小写转大写
* @author lily200825 2011-5-16
* <li>最大支持<font color='red'>仟万亿</font>(16位整数,2位小数)</li>
*/
public class RMB {
//输出日志
public static volatile boolean isDebug = false;
//阶值 {仟万亿 。。。 仟,佰,拾,元}
public static final String[] unit = { "仟","佰","拾","万"
,"仟","佰","拾","亿"
,"仟","佰","拾","万"
,"仟" ,"佰","拾","元" };
// 数字表示
public static final char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌','玖' };
/**
* 小写金额 转 大写金额
* <li>最大支持<font color='red'>百万亿</font>(15位整数,2位小数) ;或<font color='red'>仟万亿</font>(16位整数)</li>
* <li>超过最大支持<font color='red'>仟万亿</font>(16位整数),只输出大写数字</li>
* <li>整数部分越大,则小数部分输出越不精确</li>
* <li>负数,则忽略负号</li>
* @param amount
* @return 大写金额
*/
public static String number2UpperCase(double replaceall() _amount){
double amount = Math.abs(_amount);
StringBuffer result = new StringBuffer();
/*
* -------- 整数部分 --------
*/
StringBuffer result_intStr = new StringBuffer();
long num = (long)amount;
// 转成大写
String intStr = getUpperCase(num);
int len = intStr.length();
String regex_01 = "(零.)+";
String regex_00 = "(零)+";
String rep_str = "零";
char zero = '零';
if(len<=16){
// ====== 仟万亿 ======
int index = 0;
for(int i=16-len ; i<16; i++){
result_intStr.append(intStr.charAt(index++));
//加权值
result_intStr.append(unit[i]);
}
//加权后,未合并连续零
String temp_intStr = String();
int temp_len = temp_intStr.length();
if(isDebug){
System.out.println("加权后未处理连续零,["+temp_intStr+"]。");
}
result_intStr = new StringBuffer();
if(len>=13){
//万亿 ,合并连续的 零X ->
String str = temp_intStr.substring(0, temp_len-12*2).replaceAll(regex_01, rep_str);
result_intStr.append( str.charAt(str.length()-1) == zero ? str.substring(0, str.length()-1)+'万' : str);
}
if(len>=9){
//亿 ,合并连续的 零X
int start = temp_len-12*2 < 0 ? 0 : temp_len-12*2 ;
String str = temp_intStr.substring(start , temp_len-8*2).replaceAll(regex_01, rep_str);
result_intStr.append( str.charAt(str.length()-1) == zero ? str.substring(0, str.length()-1)+'亿' : str);
}
if(len>=5){
//万 ,合并连续的 零X
int start = temp_len-8*2 < 0 ? 0 : temp_len-8*2 ;
String str = temp_intStr.substring(start , temp_len-4*2).replaceAll(regex_01, rep_str);
result_intStr.append( str.charAt(str.length()-1) == zero ? str.substring(0, str.length()-1)+'万' : str);
}
if(len>=1){
//元 ,合并连续的 零X
int start = temp_len-4*2 < 0 ? 0 : temp_len-4*2 ;
String str = temp_intStr.substring(start , temp_len).replaceAll(regex_01, rep_str);
result_intStr.append( str.charAt(str.length()-1) == zero ? str.substring(0, str.length()-1)+'元' : str);
}
//最后处理
String last_intStr = String().replaceAll(regex_00, rep_str);
if(last_intStr.length()==1){
//元
last_intStr = zero+last_intStr;
result_intStr = new StringBuffer(last_intStr);
}else{
//XX亿万玖仟元 -> XX亿零玖仟元
int w_index = last_intStr.lastIndexOf('万');
if(len>=9 && w_index>0 && last_intStr.charAt(w_index-1)=='亿'){
last_intStr = last_intStr.substring(0, w_index) + zero + last_intStr.substring(w_index+1);
result_intStr = new StringBuffer(last_intStr);
}
}
}else{
//======= 超过 仟万亿 =======
if(isDebug){
System.out.println("超过 仟万亿。。。只输出大写数字");
}
result_intStr.append(intStr);
result_intStr.append("元");
}
//加入结果
result.append(String().replaceAll(regex_00, String.valueOf(zero) ));
result.append(" ");
if(isDebug){
System.out.println("处理连续零,["+String()+"]。");
}
/*
* -------- 小数部分(保留二位小数) --------
*/
//小数部分(保留二位小数) 0.01
double decimal = Double.parseDouble( new DecimalFormat("0.00").format(amount - (double)num) ) ;
if(decimal>0d){
StringBuffer result_floatStr = new StringBuffer();
String decimalStr = new DecimalFormat("0.00").format(amount - num);
len = decimalStr.length();
decimalStr = decimalStr.substring(2, len>5? 4 : len);
result_floatStr.append(getUpperCase(Long.parseLong(decimalStr.substring(0, 1))));
result_floatStr.append("角");
result_floatStr.append(getUpperCase(Long.parseLong(decimalStr.substring(1, 2))));
result_floatStr.append("分");
//加入结果
result.append(result_floatStr);
if(isDebug){
System.out.println("处理小数,["+result_floatStr+"]。");
}
}
String();
}
/**
* 数字大写
* @param num
* <li>保持原来排列输出</li>
* @return
*/
public static String getUpperCase(long num){
return getUpperCase(num,true);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论