`
laibin1320
  • 浏览: 5957 次
  • 性别: Icon_minigender_1
  • 来自: 商丘
文章分类
社区版块
存档分类
最新评论

数值显示成中文大写金额

 
阅读更多
今天用普元的报表打印时,不符合客户的要求,比如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`这两个文件中,我们可以预见到定义了这些逻辑的函数和类。通过阅读源代码,我们可以学习...

    小写金额转换为大写金额

    而大写金额则是为了防止篡改和提高凭证的正式性,常用于支票、合同等正式文档中,例如“壹拾贰万叁仟肆佰伍拾陆元柒角捌分”。在编程中,我们需要编写函数或程序来实现小写金额到大写金额的转换。这个过程涉及到数字...

    FastReport小写金额转大写

    本例中的代码展示了一个具体的实现过程,用于将货币类型的数值(小写金额)转换为汉字大写形式。 #### 实现原理与步骤 1. **初始化与预处理**:首先,定义一个函数`jezh(xxje:currency):String;`,接收一个货币...

    oracle中将小写金额转换为大写金额函数

    本文将详细介绍一个自定义的Oracle函数`money_to_chinese`,该函数能够将小写金额(数字)转换为中文大写金额。 #### 函数定义 ```sql CREATE OR REPLACE FUNCTION money_to_chinese(money IN VARCHAR2) RETURN ...

    .NET转换大写金额

    此函数接收一个`Double`类型的参数`Money`,表示需要转换的金额数值,并返回一个字符串类型的结果,即转换后的中文大写金额。 #### 变量声明 在函数内部,首先声明了一系列变量用于存储中间结果和辅助数据: - `x...

    mysql 函数,可以将数字转换为中文大写形式

    mysql 函数,可以将数字转换为中文大写形式。大写数字是中国特有的数字书写方式,利用与数字同音的汉字取代数字,以防止数目被涂改。 据考证,大写数字最早是由武则天发明,后经朱元璋改进完善。

    小写金额转换为大写金额程序(VB6.0代码编写)

    小写金额通常指的是阿拉伯数字形式的金额,如12345.67,而大写金额则是中文数字的表示,例如“壹万贰仟叁佰肆拾伍元陆角柒分”。这个程序的工作原理可能是通过接收用户输入的小写金额,然后按照特定的规则将其转换为...

    如何实现金额大写转换Visual Basic6.0源程序,VB6.0源代码

    对于财务报表或发票,通常需要将数字金额转换成大写的汉字表示,以便增强数据的可读性和防止篡改。本篇文章将详细介绍如何在VB6.0中实现这个功能。 1. **基础概念** - **Visual Basic 6.0**:微软开发的一种面向...

    delphi金额转换成中文大写.rar

    5. **UI界面设计**:在报表或财务系统中,用户可能需要输入或查看转换后的中文大写金额。因此,UI界面需要有合适的输入框和显示区域,可能还需要提供转换按钮,点击后实时显示转换结果。 6. **测试与调试**:确保...

    数字金额转换为大写汉字

    读入一个浮点数值,转换为金额大写。整数只显示整数部分。含连续0只输出一个“零”。整圆显示“整”。

    C#-WinForm(金额转大写金额)

    在C#编程中,开发Windows桌面应用程序(WinForm)时,有时我们需要将用户输入的数字金额转换成中文大写,以便于财务报表或发票的规范显示。本文将深入探讨如何在C# WinForm中实现这一功能,主要涉及字符串操作、条件...

    pb中大写金额转换

    在编程领域,尤其是在财务软件开发中,经常需要将阿拉伯数字转换为中文大写金额,以满足财务报告和凭证规范的要求。标题"pb中大写金额转换"指的是在PowerBuilder(PB)环境中实现这一功能。PowerBuilder是一种流行的...

    Qt实现人民币大写

    5. **显示结果**:最后,使用Qt的`QString`类进行字符串操作,构建完整的人民币大写金额,并将其显示在界面上,如`QLabel`控件。 6. **异常处理**:虽然题目没有提及用户输入错误的情况,但良好的编程习惯是应考虑...

    大写金额转换器

    【大写金额转换器】是一种实用工具,专为金融、会计和商业领域的用户设计,能够将数字金额转换成中文大写形式。在处理财务文件、合同或者发票时,按照中国的传统,金额通常需要以中文大写来表示,以增强文档的清晰度...

    输入小写金额,对应的出现大写金额

    为了提高数据处理的准确性与用户的阅读体验,常常需要将用户输入的小写金额转换为规范的大写金额形式,同时为了便于阅读,还会在数值中每三位数字后添加逗号分隔符。这种需求通常通过前端JavaScript或者后端语言(如...

    ios-数字金额转大写金额.zip

    - 实时转换:用户输入时,应实时更新大写金额的显示,提供良好的交互体验。 - 错误提示:当输入不合法时,提供清晰的错误提示。 6. **代码实现**: - 可能采用Swift或Objective-C编写,这两种语言都是iOS开发的...

    Delphi编写小写金额转大写

    首先,我们要了解在中文中,小写金额(阿拉伯数字)转换为大写金额(汉字)的基本规则。在中文里,1至9的大写是壹、贰、叁、肆、伍、陆、柒、捌、玖,0通常表示为空或零,而个、十、百、千、万、亿等是作为位值的...

    人民币金额大写的Excel公式.rar

    4. **特殊字符**:人民币大写金额中包含"零"、"壹"、"贰"等特殊的汉字,这些需要预先设定好对应的文本字符串。 5. **公式组合**:最后的转换公式通常是多个函数的组合,它们一起工作来完成从阿拉伯数字到大写汉字的...

    使用java将人民币金额转换成大写并使用自定义标签显示到页面

    本篇将介绍如何使用Java编程语言将人民币金额转换成大写,并且通过自定义标签库(Tag Library)在网页上显示。首先,我们来看`ChangeNumMoney.java`这个文件,它可能包含了实现金额转换的核心逻辑。 `...

Global site tag (gtag.js) - Google Analytics