`
hsys
  • 浏览: 290552 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

递归实现会计金额大小写转换

    博客分类:
  • Java
J# 
阅读更多

import java.text.DecimalFormat;
import java.text.NumberFormat;


public class MoneyUtils {
	/**
	 * 中文中繁写的汉字金额 经常使用
	 */
	public static String[] upperNums = new String[] { "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "零","整","正" };
	/**
	 * 与汉字相应的转化的数字
	 */
	public static int[] lowerNums = new int[] { 1, 2, 3, 4, 5, 6, 7,8, 9,  0 ,0,0};
	/**
	 * 倍数关键词 简写 注意:一定要由大到小
	 */
	public static String[] rmbMult = new String[] { "亿", "万", "仟", "佰", "拾","元","圆","整","正","角","分" };
	/**
	 * 与倍数关键词对应的倍数
	 */
	public static double[] toMult = new double[] { 100000000, 10000, 1000, 100,10,1,1,1,1,0.1,0.01 };
	
	public static String negative = "(负数)";
	
	public static double toLower(String amountInWords){
		int ispositive = 1;
		if(amountInWords.indexOf(negative)>=0){
			ispositive = -1;
			amountInWords = amountInWords.replace(negative, "");
		}
		double amountInFigures = 0;
		if(amountInWords.length() == 1){
			return getLowerNum(amountInWords);
		}
		else if(amountInWords.length() == 2 && amountInWords.substring(0,1).equals(upperNums[9])){
			return getLowerNum(amountInWords.substring(1,2));
		}else{
			for (int i = 0; i < rmbMult.length; i++) {
				int index = amountInWords.lastIndexOf(rmbMult[i]);
				if (index >= 0) {
					String storeMult = amountInWords.substring(0, index);
					amountInWords = amountInWords.substring(index + 1);
					amountInFigures = toLower(storeMult)*toMult[i] + toLower(amountInWords);
					break;
				}
			}
		}
		return amountInFigures*ispositive;
	}
	
	private static double getLowerNum(String upperNum){
		for (int j = 0; j < upperNums.length; j++) {
			if(upperNum.equals(upperNums[j])){
				return lowerNums[j];
			}
		}
		return 0;
	}
	
	public static String toUpper(String amountInFiguresStr){
		String amountInWords = "";
		String integerPart = amountInFiguresStr;
		String decimalPart = "";
		int indexOfDot = amountInFiguresStr.indexOf('.');
		if(indexOfDot >= 0){
			integerPart = amountInFiguresStr.substring(0,indexOfDot);
			if(amountInFiguresStr.length() - 1 > indexOfDot){
				decimalPart = amountInFiguresStr.substring(indexOfDot+1);
			}
		}
		double tempPrice = 0;
		try {
			tempPrice = Double.parseDouble(amountInFiguresStr);
		} catch (NumberFormatException e) {
			tempPrice = 0;
		}
		if(tempPrice == 0){ //如果输入的是0或者无法转成double时,设为0 
			amountInWords = upperNums[9]; //零 
		}else{
			if(!integerPart.equals("")){
				long integerNum = Long.parseLong(integerPart);
				if(tempPrice < 0){
					amountInWords = negative;
				}
				if(integerNum != 0){
					amountInWords += intToUpper(Math.abs(integerNum));
					amountInWords +=  rmbMult[5]; //元
				}
			}
			if(decimalPart.equals("") || Integer.parseInt(decimalPart) == 0){
				amountInWords += rmbMult[7]; //整  
			}else{
				amountInWords += getUpperNum(Integer.parseInt(decimalPart.substring(0,1)));
				if(!decimalPart.substring(0,1).equals("0")){
					amountInWords +=  rmbMult[9]; //角
				}
				if(decimalPart.length() > 1 && !decimalPart.substring(1,2).equals("0")){
					amountInWords += getUpperNum(Integer.parseInt(decimalPart.substring(1,2))) + rmbMult[10]; //分
				}
			}
		}
		return amountInWords;
	}
	
	private static String intToUpper(long amountInFigures){
		if(amountInFigures == 0){
			return "";
		}
		else if(amountInFigures < 10){
			return getUpperNum((int)amountInFigures);
		}else{
			String amountInWords = "";
			for(int i=0;i<toMult.length - 2;i++){
				int divisor =(int)(amountInFigures / (long)toMult[i]);
				long mod = amountInFigures % (long)toMult[i];
				if(divisor > 0){
					amountInWords += intToUpper(divisor) + rmbMult[i];
					if(0 < mod && mod < (long)toMult[i]/10){
						amountInWords += upperNums[9];
					}
					amountInWords +=  intToUpper(mod);
					break;
				}
			}
			return amountInWords;
		}
	}
	
	private static String getUpperNum(int lowerNum){
		for(int i=0;i<lowerNums.length;i++){
			if(lowerNum == lowerNums[i]){
				return upperNums[i];
			}
		}
		return upperNums[9]; //零 
	}
	
	public static void main(String[] args){
		String amountInFiguresStr = "-124500002.43";
		String amountInWords = toUpper(amountInFiguresStr);
		System.out.println(amountInWords);
		double amountInFigures = toLower(amountInWords);
		NumberFormat formatter = new DecimalFormat("0.00");
		System.out.println(formatter.format(amountInFigures));
	}
}




如果有错误,希望大家能够给我指出来,谢谢
分享到:
评论

相关推荐

    c#实现大小写金额转换

    下面,我们将深入探讨如何在C#中实现大小写金额转换,基于提供的代码片段进行分析和扩展。 ### C#中的大小写金额转换 #### 功能概述 在C#中实现大小写金额转换的核心在于将阿拉伯数字转换为中文大写数字,并适当地...

    ackermann函数的递归实现和非递归实现

    非递归实现的基本思想是将递归调用转化为循环,并使用数据结构(如堆栈)存储中间结果,避免了递归带来的调用栈溢出问题。 非递归实现的步骤大致如下: 1. 初始化一个堆栈,用于保存待处理的阿克曼函数参数对`(m, ...

    人民币转换程序 大小写转换

    人民币的大小写转换是财务和会计领域中的基本操作,因为在中国,正式的财务文件中通常要求金额用大写汉字表示,以防止篡改和增加准确性。这个“人民币转换程序”就是为了解决这样的问题而设计的。 程序的核心功能是...

    递归实现回文判断

    根据给定的文件信息,我们可以总结出以下关于“递归实现回文判断”的知识点: ### 一、回文概念 回文是指一个字符串从左到右读和从右到左读都是一样的字符串。例如,“abcba”、“madam”等都是回文字符串。 ### ...

    递归算法到非递归算法的转换.ppt

    它包括递归出口(定义递归何时停止)和递归体(描述如何通过较小的子问题求解当前问题)。递归出口通常是基本情况,递归体则描述了递归如何自减规模并逐步解决问题。 将递归转换为非递归的关键在于使用循环和辅助的...

    阿克曼函数非递归实现

    通过以上分析,我们可以看到,阿克曼函数的非递归实现主要涉及堆栈操作、递归转换以及对计算复杂性的理解。这个话题对于学习数据结构和算法的学生来说,是一个挑战性的实践项目,有助于提升他们的编程技能和对复杂...

    快速选择非递归与递归算法实现

    快速选择算法是基于快速排序的一种高效选择算法,用于在未排序的数据集合中找到第k小(或第k大)的元素。它由C.A.R. Hoare在1960年提出,是线性时间复杂度的算法,在平均情况下表现优秀。在本主题中,我们将深入探讨...

    快速排序 --- 非递归实现

    快速排序非递归实现的优点包括避免了递归带来的系统栈空间开销,对于大数据量排序更有效。同时,由于使用了栈,其时间复杂度依然保持为O(n log n),在平均情况下表现优秀。但缺点是在最坏的情况下,如果输入数组已经...

    二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现。

    根据给定文件的信息,本文将详细介绍二叉树与树之间的转换方法,并且深入探讨树的前序、中序、后序遍历递归与非递归实现方式,以及层次遍历的非递归算法实现。 ### 二叉树与树的转换 在计算机科学中,树是一种常用...

    八皇后递归及非递归实现源码

    八皇后递归及非递归实现源码; 八皇后递归及非递归实现源码

    汉诺塔的非递归实现,c++

    通过这种方式,我们可以学习如何将递归算法转换为迭代算法,以及如何使用栈来模拟递归过程,这对于理解和优化算法性能至关重要。 总之,非递归的汉诺塔问题C++实现是一种创新的解决方案,它利用数据结构来避免递归...

    C语言递归实现逆序程序

    C语言递归实现逆序程序 C语言初学者必会

    递归实现字符串逆序

    ### 递归实现字符串逆序 #### 知识点概览 本文将详细介绍如何使用C++中的递归技术来实现字符串的逆序操作。逆序字符串是一个常见的编程问题,在多种场景下都有应用,例如文本处理、算法设计等。通过递归方法解决此...

    java 用递归实现字符串反转

    ### Java使用递归实现字符串反转 在Java编程语言中,递归是一种常用的方法来解决许多问题,特别是那些可以通过分解成更小子问题来解决的问题。本文将详细介绍如何使用递归来实现字符串的反转。 #### 一、递归基础...

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...

    c++递归实现十进制数转二进制(输入式

    数据结构,递归实现十进制数转二进制数,C++实现,可多次输入数

    java递归实现 阶乘

    递归定义描述了问题如何分解成更小的子问题,而递归基础则是递归停止的条件,防止无限循环。 需要注意的是,递归虽然简洁、优雅,但也有其局限性和缺点。首先,递归会占用更多的内存,因为每次函数调用都会在内存栈...

    非递归实现fibonacci数列

    使用C++非递归实现fibonacci数列,对正在学习算法的同学应该挺有帮助的

    递归实现字符串反向输出

    ### 递归实现字符串反向输出 在计算机科学领域,递归是一种常用且重要的编程技巧。本文将通过一个具体的例子——使用C语言实现字符串的反向输出,来深入理解递归的基本概念及其应用。 #### 一、递归基础 递归...

    递归实现元素全排列.html

    递归实现元素全排列

Global site tag (gtag.js) - Google Analytics