数值显示成中文大写金额

今天用普元的报表打印时,不符合客户的要求,比如10,打印成了“拾元”,但客户要求打
印成“壹拾元”,类似的有“壹拾肆万”等等,原本想自己在网上搜一个,每个打印都要调
用下,觉得改的东西太多,索性把普元的jar包反编译下,所有的打印一次搞定。

只需修改com.primeton.report.core_6.0.0.jar下的com.primeton.report.core.format.ChineseCapNumber.java即可。
修改前的源代码如下:



package com.primeton.report.core.format;

import java.text.*;

public class ChineseCapNumber extends NumberFormat
{

private String HanDigiStr[] = {
"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"
};
private String HanDiviStr[] = {
"", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
"佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟",
"万", "拾", "佰", "仟"
};
private String LHanDigiStr[] = {
"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"
};
private String LHanDiviStr[] = {
"", "十", "百", "千", "万", "十", "百", "千", "亿", "十",
"百", "千", "万", "十", "百", "千", "亿", "十", "百", "千",
"万", "十", "百", "千"
};
protected String formatPattern;
protected String SignStr;
public static String CHINA_CAP_NUMBER = "@@@";
public static String CHINA_LCAP_NUMBER = "@@#";
public static String CHINA_RMB_CAP_NUMBER = "@#@";
public static String CHINA_SIGN_TYPE = ";@#";
public static String ENGLISH_SIGN_TYPE = ";#@";
private boolean isEnglishSign;
public static String CHINA_SIGN = "负";
public static String ENGLISH_SIGN = "(";

public ChineseCapNumber()
{
isEnglishSign = false;
applyPattern(null);
}

public ChineseCapNumber(String format)
{
isEnglishSign = false;
applyPattern(format);
}

public void applyPattern(String format)
{
if (format.indexOf(CHINA_SIGN_TYPE) > 0)
{
SignStr = CHINA_SIGN;
formatPattern = format.split(CHINA_SIGN_TYPE)[0];
} else
if (format.indexOf(ENGLISH_SIGN_TYPE) > 0)
{
isEnglishSign = true;
SignStr = ENGLISH_SIGN;
formatPattern = format.split(ENGLISH_SIGN_TYPE)[0];
} else
{
SignStr = "-";
formatPattern = format;
}
}

private String positiveIntegerToHanStr(String NumStr)
{
String RMBStr = "";
boolean lastzero = false;
boolean hasvalue = false;
int len = NumStr.length();
if (len > 15)
return "数值过大!";
for (int i = len - 1; i >= 0; i--)
{
if (NumStr.charAt(len - i - 1) == ' ')
continue;
int n = NumStr.charAt(len - i - 1) - 48;
if (n < 0 || n > 9)
return "输入含非数字字符!";
if (n != 0)
{
if (lastzero)
RMBStr = (new StringBuilder()).append(RMBStr).append(HanDigiStr[0]).toString();
if (n != 1 || i % 4 != 1 || i != len - 1)
RMBStr = (new StringBuilder()).append(RMBStr).append(HanDigiStr[n]).toString();
RMBStr = (new StringBuilder()).append(RMBStr).append(HanDiviStr[i]).toString();
hasvalue = true;
} else
if (i % 8 == 0 || i % 8 == 4 && hasvalue)
RMBStr = (new StringBuilder()).append(RMBStr).append(HanDiviStr[i]).toString();
if (i % 8 == 0)
hasvalue = false;
lastzero = n == 0 && i % 4 != 0;
}

if (RMBStr.length() == 0)
return HanDigiStr[0];
else
return RMBStr;
}

private String positiveIntegerToLHanStr(String NumStr)
{
String RMBStr = "";
boolean lastzero = false;
boolean hasvalue = false;
int len = NumStr.length();
if (len > 15)
return "数值过大!";
for (int i = len - 1; i >= 0; i--)
{
if (NumStr.charAt(len - i - 1) == ' ')
continue;
int n = NumStr.charAt(len - i - 1) - 48;
if (n < 0 || n > 9)
return "输入含非数字字符!";
if (n != 0)
{
if (lastzero)
RMBStr = (new StringBuilder()).append(RMBStr).append(LHanDigiStr[0]).toString();
if (n != 1 || i % 4 != 1 || i != len - 1)
RMBStr = (new StringBuilder()).append(RMBStr).append(LHanDigiStr[n]).toString();
RMBStr = (new StringBuilder()).append(RMBStr).append(LHanDiviStr[i]).toString();
hasvalue = true;
} else
if (i % 8 == 0 || i % 8 == 4 && hasvalue)
RMBStr = (new StringBuilder()).append(RMBStr).append(LHanDiviStr[i]).toString();
if (i % 8 == 0)
hasvalue = false;
lastzero = n == 0 && i % 4 != 0;
}

if (RMBStr.length() == 0)
return LHanDigiStr[0];
else
return RMBStr;
}

public Number parse(String source, ParsePosition parsePosition)
{
return null;
}

public StringBuffer format(double val, StringBuffer toAppendTo, FieldPosition pos)
{
StringBuffer sb = new StringBuffer();
String headStr = "";
String tailStr = "";
String TailStr = "";
if (val < 0.0D)
{
val = -val;
} else
{
isEnglishSign = false;
SignStr = "";
}
if (val > 100000000000000D || val < -100000000000000D)
return sb.append("数值位数过大!");
long temp = Math.round(val * 100D);
long integer = temp / 100L;
long fraction = temp % 100L;
int jiao = (int)fraction / 10;
int fen = (int)fraction % 10;
if (formatPattern.indexOf(CHINA_RMB_CAP_NUMBER) >= 0)
{
String formatStr[] = formatPattern.split(CHINA_RMB_CAP_NUMBER);
if (formatStr.length > 0)
headStr = formatStr[0];
if (formatStr.length > 1)
tailStr = formatStr[1];
if (isEnglishSign)
{
sb.append(SignStr);
SignStr = "";
}
if (jiao == 0 && fen == 0)
{
TailStr = "整";
} else
{
TailStr = HanDigiStr[jiao];
if (jiao != 0)
TailStr = (new StringBuilder()).append(TailStr).append("角").toString();
if (integer == 0L && jiao == 0)
TailStr = "";
if (fen != 0)
TailStr = (new StringBuilder()).append(TailStr).append(HanDigiStr[fen]).append("分").toString();
}
sb.append(headStr);
sb.append((new StringBuilder()).append(SignStr).append(positiveIntegerToHanStr(String.valueOf(integer))).append("元").append(TailStr).toString());
sb.append(tailStr);
if (isEnglishSign)
sb.append(")");
} else
if (formatPattern.indexOf(CHINA_CAP_NUMBER) >= 0)
{
String formatStr[] = formatPattern.split(CHINA_CAP_NUMBER);
if (formatStr.length > 0)
headStr = formatStr[0];
if (formatStr.length > 1)
tailStr = formatStr[1];
if (isEnglishSign)
{
sb.append(SignStr);
SignStr = "";
}
if (jiao == 0 && fen == 0)
{
TailStr = "";
} else
{
TailStr = (new StringBuilder()).append(".").append(HanDigiStr[jiao]).toString();
if (fen != 0)
TailStr = (new StringBuilder()).append(TailStr).append(HanDigiStr[fen]).toString();
}
sb.append(headStr);
sb.append((new StringBuilder()).append(SignStr).append(positiveIntegerToHanStr(String.valueOf(integer))).append(TailStr).toString());
sb.append(tailStr);
if (isEnglishSign)
sb.append(")");
} else
{
String formatStr[] = formatPattern.split(CHINA_LCAP_NUMBER);
if (formatStr.length > 0)
headStr = formatStr[0];
if (formatStr.length > 1)
tailStr = formatStr[1];
if (isEnglishSign)
{
sb.append(SignStr);
SignStr = "";
}
if (jiao == 0 && fen == 0)
{
TailStr = "";
} else
{
TailStr = (new StringBuilder()).append(".").append(LHanDigiStr[jiao]).toString();
if (fen != 0)
TailStr = (new StringBuilder()).append(TailStr).append(LHanDigiStr[fen]).toString();
}
sb.append(headStr);
sb.append((new StringBuilder()).append(SignStr).append(positiveIntegerToLHanStr(String.valueOf(integer))).append(TailStr).toString());
sb.append(tailStr);
if (isEnglishSign)
sb.append(")");
}
return sb;
}

public StringBuffer format(long val, StringBuffer toAppendTo, FieldPosition pos)
{
StringBuffer sb = new StringBuffer();
String headStr = "";
String tailStr = "";
if (val < 0L)
{
val = -val;
} else
{
isEnglishSign = false;
SignStr = "";
}
if (formatPattern.indexOf(CHINA_RMB_CAP_NUMBER) >= 0)
{
String formatStr[] = formatPattern.split(CHINA_RMB_CAP_NUMBER);
if (formatStr.length > 0)
headStr = formatStr[0];
if (formatStr.length > 1)
tailStr = formatStr[1];
if (isEnglishSign)
{
sb.append(SignStr);
SignStr = "";
}
sb.append(headStr);
sb.append((new StringBuilder()).append(SignStr).append(positiveIntegerToHanStr(String.valueOf(val))).append("元").toString());
sb.append(tailStr);
if (isEnglishSign)
sb.append(")");
} else
if (formatPattern.indexOf(CHINA_CAP_NUMBER) >= 0)
{
String formatStr[] = formatPattern.split(CHINA_CAP_NUMBER);
if (formatStr.length > 0)
headStr = formatStr[0];
if (formatStr.length > 1)
tailStr = formatStr[1];
if (isEnglishSign)
{
sb.append(SignStr);
SignStr = "";
}
sb.append(headStr);
sb.append((new StringBuilder()).append(SignStr).append(positiveIntegerToHanStr(String.valueOf(val))).toString());
sb.append(tailStr);
if (isEnglishSign)
sb.append(")");
} else
{
String formatStr[] = formatPattern.split(CHINA_LCAP_NUMBER);
if (formatStr.length > 0)
headStr = formatStr[0];
if (formatStr.length > 1)
tailStr = formatStr[1];
if (isEnglishSign)
{
sb.append(SignStr);
SignStr = "";
}
sb.append(headStr);
sb.append((new StringBuilder()).append(SignStr).append(positiveIntegerToLHanStr(String.valueOf(val))).toString());
sb.append(tailStr);
if (isEnglishSign)
sb.append(")");
}
return sb;
}




只需注释掉上述代码中的“if (n != 1 || i % 4 != 1 || i != len - 1)”就可以了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值