今天用普元的报表打印时,不符合客户的要求,比如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)”就可以了!
分享到:
相关推荐
6. **组合结果**:将转换后的整数部分、小数部分和单位组合成完整的中文大写金额。 在`MoneyUtil.java`和`MoneyFormat.java`这两个文件中,我们可以预见到定义了这些逻辑的函数和类。通过阅读源代码,我们可以学习...
而大写金额则是为了防止篡改和提高凭证的正式性,常用于支票、合同等正式文档中,例如“壹拾贰万叁仟肆佰伍拾陆元柒角捌分”。在编程中,我们需要编写函数或程序来实现小写金额到大写金额的转换。这个过程涉及到数字...
本例中的代码展示了一个具体的实现过程,用于将货币类型的数值(小写金额)转换为汉字大写形式。 #### 实现原理与步骤 1. **初始化与预处理**:首先,定义一个函数`jezh(xxje:currency):String;`,接收一个货币...
本文将详细介绍一个自定义的Oracle函数`money_to_chinese`,该函数能够将小写金额(数字)转换为中文大写金额。 #### 函数定义 ```sql CREATE OR REPLACE FUNCTION money_to_chinese(money IN VARCHAR2) RETURN ...
此函数接收一个`Double`类型的参数`Money`,表示需要转换的金额数值,并返回一个字符串类型的结果,即转换后的中文大写金额。 #### 变量声明 在函数内部,首先声明了一系列变量用于存储中间结果和辅助数据: - `x...
mysql 函数,可以将数字转换为中文大写形式。大写数字是中国特有的数字书写方式,利用与数字同音的汉字取代数字,以防止数目被涂改。 据考证,大写数字最早是由武则天发明,后经朱元璋改进完善。
小写金额通常指的是阿拉伯数字形式的金额,如12345.67,而大写金额则是中文数字的表示,例如“壹万贰仟叁佰肆拾伍元陆角柒分”。这个程序的工作原理可能是通过接收用户输入的小写金额,然后按照特定的规则将其转换为...
对于财务报表或发票,通常需要将数字金额转换成大写的汉字表示,以便增强数据的可读性和防止篡改。本篇文章将详细介绍如何在VB6.0中实现这个功能。 1. **基础概念** - **Visual Basic 6.0**:微软开发的一种面向...
5. **UI界面设计**:在报表或财务系统中,用户可能需要输入或查看转换后的中文大写金额。因此,UI界面需要有合适的输入框和显示区域,可能还需要提供转换按钮,点击后实时显示转换结果。 6. **测试与调试**:确保...
读入一个浮点数值,转换为金额大写。整数只显示整数部分。含连续0只输出一个“零”。整圆显示“整”。
在C#编程中,开发Windows桌面应用程序(WinForm)时,有时我们需要将用户输入的数字金额转换成中文大写,以便于财务报表或发票的规范显示。本文将深入探讨如何在C# WinForm中实现这一功能,主要涉及字符串操作、条件...
在编程领域,尤其是在财务软件开发中,经常需要将阿拉伯数字转换为中文大写金额,以满足财务报告和凭证规范的要求。标题"pb中大写金额转换"指的是在PowerBuilder(PB)环境中实现这一功能。PowerBuilder是一种流行的...
5. **显示结果**:最后,使用Qt的`QString`类进行字符串操作,构建完整的人民币大写金额,并将其显示在界面上,如`QLabel`控件。 6. **异常处理**:虽然题目没有提及用户输入错误的情况,但良好的编程习惯是应考虑...
【大写金额转换器】是一种实用工具,专为金融、会计和商业领域的用户设计,能够将数字金额转换成中文大写形式。在处理财务文件、合同或者发票时,按照中国的传统,金额通常需要以中文大写来表示,以增强文档的清晰度...
为了提高数据处理的准确性与用户的阅读体验,常常需要将用户输入的小写金额转换为规范的大写金额形式,同时为了便于阅读,还会在数值中每三位数字后添加逗号分隔符。这种需求通常通过前端JavaScript或者后端语言(如...
- 实时转换:用户输入时,应实时更新大写金额的显示,提供良好的交互体验。 - 错误提示:当输入不合法时,提供清晰的错误提示。 6. **代码实现**: - 可能采用Swift或Objective-C编写,这两种语言都是iOS开发的...
首先,我们要了解在中文中,小写金额(阿拉伯数字)转换为大写金额(汉字)的基本规则。在中文里,1至9的大写是壹、贰、叁、肆、伍、陆、柒、捌、玖,0通常表示为空或零,而个、十、百、千、万、亿等是作为位值的...
4. **特殊字符**:人民币大写金额中包含"零"、"壹"、"贰"等特殊的汉字,这些需要预先设定好对应的文本字符串。 5. **公式组合**:最后的转换公式通常是多个函数的组合,它们一起工作来完成从阿拉伯数字到大写汉字的...
本篇将介绍如何使用Java编程语言将人民币金额转换成大写,并且通过自定义标签库(Tag Library)在网页上显示。首先,我们来看`ChangeNumMoney.java`这个文件,它可能包含了实现金额转换的核心逻辑。 `...