数值显示成中文大写金额

今天用普元的报表打印时,不符合客户的要求,比如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)”就可以了!

你可能感兴趣的:(中文)