import java.util.Map;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
import net.sf.jasperreports.engine.fill.JRFillVariable;
/**
* 大写金额转换Scriptlet类
*
* @author
*/
public class TransChineseMoneyScriptlet extends JRDefaultScriptlet {
/**//*
* 默认构造方法
*/
public TransChineseMoneyScriptlet() {
}
/**
* 获得金额的汉字大写格式
*
* @param money
* 小写金额字符串
* @return 大写的汉字金额
*/
public static String getChineseMoney(String money) {
String text = toUpperMoneyNum(money);
if (text.substring(text.length() - 1).equals("元")) {
text += "整";
}
return text;
}
public static String getChineseDigit(String num) {
String text = toUpperNum(num);
return text;
}
static boolean isZeroNum = false;// 数字为零,为全局变量出方法前必须还原为假
static boolean isZero = false;// 千位上开始为零,为真.防止千位开始连续5为以上为0
public static String toUpperNum(String numStr) {
if (!isNum(numStr)) {
return "";
}
isZeroNum = false;// 数字为零,为全局变量出方法前必须还原为假
isZero = false;// 这两个全局变量必须还原,因为循环调用此方法是,
// 转换前一个数所做的值得改变还会保留,可能进此方法,两个判断词就true了
String retNum = "";
int num1 = 0;
int zeroNo = 0;
for (int i = numStr.length() - 1; i > 0; i--) {// 去除最后为零的数字
if(numStr.charAt(i)=='.')break;
num1 = Integer.parseInt(String.valueOf(numStr.charAt(i)));
if (num1 == 0) {
zeroNo++;
} else {
break;
}
}
numStr = numStr.substring(0, numStr.length() - zeroNo);
String toPoint = numStr;
String toPointEnd = "";
if (numStr.indexOf(".") != -1) {
toPoint = numStr.substring(0, numStr.indexOf("."));
toPointEnd = numStr.substring(numStr.indexOf(".") + 1);
}
// numStr
int len = toPoint.length();
toPoint += toPointEnd;
boolean oneZero = false;// 去除如“00234”前面的零,判断数字中的零是否从第一个连续开始都为零
for (int i = 0; i < toPoint.length(); i++) {
num1 = Integer.parseInt(String.valueOf(toPoint.charAt(i)));
if (num1 == 0) {
if (i == 0) {
oneZero = true;// 第一个数字为零
continue;
}
if (oneZero) {// 从第一个为连续零
continue;
}
} else {
oneZero = false;// 之后不为连续
}
retNum += getNumDigOnSite(num1, len - i);
}
return (retNum.equals("")) ? "零" : retNum;
}
/**
* 将数字转成大写,为字符串形式的数字
*
* @param numStr
* 字符串,当可转成数字
* @return 大写数字的字符串
*/
public static String toUpperMoneyNum(String numStr) {
if (!isNum(numStr)) {
return "";
}
isZeroNum = false;// 数字为零,为全局变量出方法前必须还原为假
isZero = false;// 这两个全局变量必须还原,因为循环调用此方法是,
// 转换前一个数所做的值得改变还会保留,可能进此方法,两个判断词就true了
String retNum = "";
int num1 = 0;
int zeroNo = 0;
for (int i = numStr.length() - 1; i > 0; i--) {// 去除最后为零的数字
if(numStr.charAt(i)=='.')break;
num1 = Integer.parseInt(String.valueOf(numStr.charAt(i)));
if (num1 == 0) {
zeroNo++;
} else {
break;
}
}
numStr = numStr.substring(0, numStr.length() - zeroNo);
String toPoint = numStr;
String toPointEnd = "";
if (numStr.indexOf(".") != -1) {
toPoint = numStr.substring(0, numStr.indexOf("."));
toPointEnd = numStr.substring(numStr.indexOf(".") + 1);
}
// numStr
int len = toPoint.length();
toPoint += toPointEnd;
boolean oneZero = false;// 去除如“00234”前面的零,判断数字中的零是否从第一个连续开始都为零
for (int i = 0; i < toPoint.length(); i++) {
num1 = Integer.parseInt(String.valueOf(toPoint.charAt(i)));
if (num1 == 0) {
if (i == 0) {
oneZero = true;// 第一个数字为零
continue;
}
if (oneZero) {// 从第一个为连续零
continue;
}
} else {
oneZero = false;// 之后不为连续
}
retNum += getNumOnSite(num1, len - i);
}
return (retNum.equals("")) ? "零元" : retNum;
}
/**
* 判断此字符能否转成数字double类型
*
* @param num
* 字符串数字
* @return 是数字为True
*/
public static boolean isNum(String num) {
try {
double num1 = Double.parseDouble(num);
num1++;// 让其计算下,没错就一定数数字
} catch (Exception e) {
// 只做捕获,不让程序死掉就行了
return false;
}
return true;
}
/**
* 数num在位置site上怎么读
*
* @param num
* 数
* @param site
* 位数
* @return String 读法
*/
private static String getNumOnSite(int num, int site) {
String str = "";
if (num == 0) {
isZeroNum = true;// 记录数字为零
if (site % 4 == 0) {
isZero = true;// 记录千为为零
}
if (site % 4 == 1) {
// 保险起见
if (!isZero) {
str = getSite(site);// 给了单位,就就不需零什么了,如四十万,零即清掉
}
isZeroNum = false;// 等于把前面记录有零的情况清掉
}
if (site < -2) {
str = getNum(num);
}// 厘单位后的数字
return str;
}
if (isZeroNum) {
str += getNum(0);
isZeroNum = false;
isZero = false;// 还原为假,
}
str += getNum(num) + getSite(site);
return str;
}
private static String getNumDigOnSite(int num, int site) {
String str = "";
if(site==0){
str += "点";
}
if (num == 0) {
isZeroNum = true;// 记录数字为零
if (site % 4 == 0) {
isZero = true;// 记录千为为零
}
if (site % 4 == 1) {
// 保险起见
if (!isZero) {
str = getSiteDig(site);// 给了单位,就就不需零什么了,如四十万,零即清掉
}
isZeroNum = false;// 等于把前面记录有零的情况清掉
}
if (site < -2) {
str += getNum(num);
}// 厘单位后的数字
return str;
}
if (isZeroNum) {
str += getNum(0);
isZeroNum = false;
isZero = false;// 还原为假,
}
str += getNum(num) + getSiteDig(site);
return str;
}
/**
* 得到数字对应的大写字
*
* @param num
* 数字(0-9)
* @return String
*/
private static String getNum(int num) {
if (num > 9) {
return "";
}
String str = "零壹贰叁肆伍陆柒捌玖";
return str.substring(num, num + 1);
}
private static String getSiteDig(int site){
String str = "";
if (site < 2) {
str = "";
// switch (site) {
// case -2:
// //str = "";
// break;
// case -1:
// //str = "";
// break;// 这上面写出小数点后的单位情况
// }
return str;
}
String siteStr="仟佰拾兆仟佰拾亿仟佰拾万仟佰拾";
if(site>siteStr.length()){
return "单位不知";
}
return String.valueOf(siteStr.charAt(siteStr.length()-site+1));
}
/**
* 得到位置所对应的单位
*
* @param site
* 位置数小数点前的
* @return String
*/
private static String getSite(int site) {
String str = "";
if (site < 0) {
str = "";
switch (site) {
case -2:
str = "厘";
break;
case -1:
str = "分";
break;// 这上面写出小数点后的单位情况
}
return str;
}
int yu = site % 4;
int chu = site / 4;
switch (yu) {
case 1:
switch (chu) {
case 0:
str = "元";
break;
case 1:
str = "万";
break;
case 2:
str = "亿";
break;
case 3:
str = "兆";
break; // 这里写上每递进的4位的单位
}
break;
case 2:
str = "拾";
break;
case 3:
str = "佰";
break;
case 0:
switch (chu) {
case 0:
str = "角";
break;
default:
str = "仟";// 其他除4余零都是千了
break;
}
}
if (isZeroNum) {
if (site % 4 != 1 || isZero) {// 如200000345的千字位千万为零,却读到万时不加万,即"";
str = "";
}
} // 处理中间的零
return str;
}
private void getLowerToUpper() throws JRScriptletException {
String keyString = "";
Double lowerMoney = 0.0;
String upperMoney ="";
String[] lowerStr = null;
for (Object obj : variablesMap.keySet()) {
keyString = String.valueOf(obj).trim();
lowerStr = keyString.split("_");
if (lowerStr[0].equals("lowerMoney")) {
lowerMoney = getVariableValue("lowerMoney_" + lowerStr[1]) == null ? new Double(
0.0)
: java.lang.Double.parseDouble(String.valueOf(getVariableValue("lowerMoney_"
+ lowerStr[1])));
upperMoney = getChineseMoney(lowerMoney + "");
if (hasPara("upperMoney_" + lowerStr[1],variablesMap))
this.setVariableValue("upperMoney_" + lowerStr[1],
upperMoney);
}else if(lowerStr[0].equals("lowerDigit")) {
lowerMoney = getVariableValue("lowerDigit_" + lowerStr[1]) == null ? new Double(
0.0)
: (java.lang.Double) getVariableValue("lowerDigit_"
+ lowerStr[1]);
upperMoney = getChineseDigit(lowerMoney + "");
if (hasPara("upperDigit_" + lowerStr[1],variablesMap))
this.setVariableValue("upperDigit_" + lowerStr[1],
upperMoney);
}
}
}
public static boolean hasPara(String para,Map vMap){//Map
for (Object obj:vMap.keySet()) {
if(para.equals(obj.toString())) return true;
}
return false;
}
/**
* Begin EVENT_AFTER_COLUMN_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void afterColumnInit() throws JRScriptletException {
// getLowerToUpper();
super.afterColumnInit();
}
/**
* End EVENT_AFTER_COLUMN_INIT This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_AFTER_DETAIL_EVAL This line is generated by iReport. Don't
* modify or move please!
*/
public void afterDetailEval() throws JRScriptletException {
getLowerToUpper();
super.afterDetailEval();
}
/**
* End EVENT_AFTER_DETAIL_EVAL This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_AFTER_GROUP_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void afterGroupInit(String groupName) throws JRScriptletException {
// System.out.println(groupName);
super.afterGroupInit(groupName);
}
/**
* End EVENT_AFTER_GROUP_INIT This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_AFTER_PAGE_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void afterPageInit() throws JRScriptletException {
// getLowerToUpper();
super.afterPageInit();
}
/**
* End EVENT_AFTER_PAGE_INIT This line is generated by iReport. Don't modify
* or move please!
*/
/**
* Begin EVENT_AFTER_REPORT_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void afterReportInit() throws JRScriptletException {
// getLowerToUpper();
super.afterReportInit();
}
/**
* End EVENT_AFTER_REPORT_INIT This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_BEFORE_COLUMN_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void beforeColumnInit() throws JRScriptletException {
// getLowerToUpper();
}
/**
* End EVENT_BEFORE_COLUMN_INIT This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_BEFORE_DETAIL_EVAL This line is generated by iReport. Don't
* modify or move please!
*/
public void beforeDetailEval() throws JRScriptletException {
// getLowerToUpper();
}
/** end EVENT_BEFORE_DETAIL_EVAL Please don't touch or move this comment */
/**
* End EVENT_BEFORE_DETAIL_EVAL This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_BEFORE_GROUP_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void beforeGroupInit(String groupName) throws JRScriptletException {
}
/**
* End EVENT_BEFORE_GROUP_INIT This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_BEFORE_PAGE_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void beforePageInit() throws JRScriptletException {
// getLowerToUpper();
}
/**
* End EVENT_BEFORE_PAGE_INIT This line is generated by iReport. Don't
* modify or move please!
*/
/**
* Begin EVENT_BEFORE_REPORT_INIT This line is generated by iReport. Don't
* modify or move please!
*/
public void beforeReportInit() throws JRScriptletException {
// getLowerToUpper();
}
public static void main(String[] args) {
System.out.println(getSiteDig(17));
System.out.println(toUpperNum("300304.11"));
System.out.println(toUpperMoneyNum("300304.11"));
}
}