`

将小写的人民币数值转换成大写形式

    博客分类:
  • Java
 
阅读更多
前几天遇到的一道笔试题,将小写的人民币数值转换成大写形式,数值取值范围为:0.00-999999999999.99。如输入102411050126.08,则输出:壹仟零贰拾肆亿壹仟壹佰零伍万零壹佰贰拾陆元零角捌分。以下为我编的程序,欢迎各位批评指教。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.regex.Pattern;
/**
 * 将小写的人民币数值转换成大写形式,数值取值范围为:0.00-999999999999.99
 * 如输入102411050126.08,则输出:壹仟零贰拾肆亿壹仟壹佰零伍万零壹佰贰拾陆元零角捌分
 * @author mcqueen
 *
 */
public class TestC {
	   public static void main(String[] args){
		double money = getRMB();
		String moneyStr=new DecimalFormat("0.00").format(money);//将double的数值转为非科学记数法,且保证只含两位小数
		Pattern pattern = Pattern.compile("[.]");
        String[] strs = pattern.split(moneyStr);//切割分开整数与小数部分
        String moneyBig=strs[0];//整数部分字符表示形式
        String moneySmall=strs[1];//小数部分字符表示形式
        StringBuffer result=new StringBuffer();
        String high="亿";
        String middle="万";
        String low="元";
        String zero="零";
        Double operNumber=Double.valueOf(moneyBig);//整数部分
        if (operNumber>10E7) {//亿级别
        	Double wan=operNumber%10E7;//前八位
        	Double qian=operNumber%10E7%10E3;//前四位
        	result.append(getNumString((operNumber-wan)/10E7));
			result.append(high);//亿
			if ((wan-qian)/10E3<1000) result.append(zero);//若千万位为零,添加"零"
			result.append(getNumString((wan-qian)/10E3));
			result.append(middle);//万
			if (qian<1000)result.append(zero);//若千位数为零,添加"零"
			result.append(getNumString(qian));
			result.append(low);//元
		}else if (operNumber>1*10E3) {//万级别
			Double qian=operNumber%10E3;//前四位
			result.append(getNumString((operNumber-qian)/10E3));
			result.append(middle);//万
			if (qian<1000) {
				result.append(zero);//若千位数为零,添加"零"
			}
			result.append(getNumString(operNumber%10E3));
			result.append(low);//元
			
		}else {//千级别
			result=getNumString(operNumber);
			result.append(low);//元
		}
        Double operFloat=Double.valueOf(moneySmall);
        result.append(getFloatString(operFloat));
        System.out.print("转换成大写格式后为:");
        System.out.println(result);
        System.out.println("*********************************");
     }
	   /**
	    * 从键盘接收用户输入
	    */
	private static double getRMB() {
		double money=0;
		   System.out.println("*********************************");
		   System.out.print("请输入人民币数:");
		   BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
		try {
			   money=Double.valueOf(reader.readLine());
			   while(money>10E11){
				   System.out.println("你输入的数值太大!请重输!");
				  money=Double.valueOf(reader.readLine());
			   }
		} catch (NumberFormatException e) {
			System.out.println("请正确输入数值!");
			System.exit(-1);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return money;
	}
	   /**
	    * 得到人民币整数数值对应的大写表示方式
	    */
	private static StringBuffer getNumString(Double operNumber) {
		StringBuffer result=new StringBuffer();
        if (operNumber>1000) {
        	double tmp=operNumber;
        	int qian=(int)tmp/1000;
        	result.append(getString(qian)+"仟");
        	tmp=tmp-qian*1000;
        	if (tmp>100) {
            	int bai=(int)tmp/100;
    			result.append(getString(bai)+"佰");
    			tmp=tmp-bai*100;
    			if (tmp>10) {
    				int shi=(int)tmp/10;
    				result.append(getString(shi)+"拾");
    				tmp=tmp-shi*10;
    				if (tmp>0) {
    					int ge=(int)tmp;
    					result.append(getString(ge));
    				}
    			}else {
					result.append("零");//十位为零
					int ge=(int)tmp;
					result.append(getString(ge));
				}
			}else {
				result.append("零");//百位为零
	  			if (tmp>10) {
    				int shi=(int)tmp/10;
    				result.append(getString(shi)+"拾");
    				tmp=tmp-shi*10;
    				if (tmp>0) {
    					int ge=(int)tmp;
    					result.append(getString(ge));
    				}
    			}else {
    				int ge=(int)tmp;
					result.append(getString(ge));
				}
			}
		}else if (operNumber>100) {
			double tmp=operNumber;
        	int bai=(int)tmp/100;
        	result.append(getString(bai)+"佰");
        	tmp=tmp-bai*100;
			if (tmp>10) {
				int shi=(int)tmp/10;
				result.append(getString(shi)+"拾");
				tmp=tmp-shi*10;
				if (tmp>0) {
					int ge=(int)tmp;
					result.append(getString(ge));
				}
		}else {
			result.append("零");//十位为零
			if (tmp>0) {
				int ge=(int)tmp;
				result.append(getString(ge));
			}
		}
		}else if(operNumber>10){
			double tmp=operNumber;
			int shi=(int)tmp/10;
			result.append(getString(shi)+"拾");
			tmp=tmp-shi*10;
			if (tmp>0) {
				int ge=(int)tmp;
				result.append(getString(ge));
			}
		}else {
			double tmp=operNumber;
			int ge=(int)tmp;
			if(ge==0)
				result.append("零");//处理输入的值为零的情况
			else 
				result.append(getString(ge));
		}
		return result;
	}
	/**
	 * 得到人民币小数部分对应的大写表示方式
	 */
	private static StringBuffer getFloatString(Double operNumber) {
		StringBuffer result=new StringBuffer();
		if (operNumber>0) {
			if (operNumber>10){
				double tmp=operNumber;
				int jiao=(int)tmp/10;
				result.append(getString(jiao)+"角");
				tmp=tmp-jiao*10;
				if (tmp>0) {
					int fen=(int)tmp;
					result.append(getString(fen)+"分");
				}
			}else {
				double tmp=operNumber;
				int fen=(int)tmp;
				result.append("零角"+getString(fen)+"分");
			}
		}else if (operNumber==0) {
			result.append("零角零分");
		}
		
		return result;
	}
	   /**
	    * 得到数字对应的汉字
	    */
	   public static String getString(int number){
		   switch (number) {
		case 1:
			return Change.YI.getName();
		case 2:
			return Change.ER.getName();
		case 3:
			return Change.SAN.getName();
		case 4:
			return Change.SI.getName();
		case 5:
			return Change.WU.getName();
		case 6:
			return Change.LIU.getName();
		case 7:
			return Change.QI.getName();
		case 8:
			return Change.BA.getName();
		case 9:
			return Change.JIU.getName();
		}
		   return null;
	   }
	   
}
/**
 * 每个数字对应的汉字
 * @author mcqueen
 */
enum Change{
	YI{public String getName(){
		return "壹";
		}
	},
	ER{public String getName(){
		return "贰";
		}
	},
	SAN{public String getName(){
		return "叁";
		}
	},
	SI{public String getName(){
		return "肆";
		}
	},
	WU{public String getName(){
		return "伍";
		}
	},
	LIU{public String getName(){
		return "陆";
		}
	},
	QI{public String getName(){
		return "柒";
		}
	},
	BA{public String getName(){
		return "捌";
		}
	},
	JIU{public String getName(){
		return "玖";
		}
	},
	SHI{public String getName(){
		return "拾";
		}
	};
	public abstract String getName();
}
分享到:
评论

相关推荐

    小写字母转化成大写字母

    将输入的字符串中所有小写字母转换成大写字母后的字符串。 #### 样例输入 ``` hello world ``` #### 样例输出 ``` HELLO WORLD ``` ### 解题思路 本题可以通过两种方法实现: 1. **手动转换**:遍历字符串中...

    PHP 人民币小写转换成大写

    在处理财务或金融数据时,有时我们需要将人民币金额从小写形式转换为大写,这通常是为了满足财务报告的标准和规范。这篇博客"PHP 人民币小写转换成大写"提供了一个实用的解决方案,通过源码实现这一功能。 首先,...

    小写人民币转大写ACCESS函数

    在日常的财务工作中,经常需要将数字格式的金额转换成汉字大写形式,尤其是在开具支票、填写电汇凭证或制作记账凭证时更为常见。这种转换不仅能够提高正式文件的专业性,还能避免因数字被篡改而引发的法律纠纷。本文...

    从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以“!”结束.

    在本程序中,我们需要将输入的字符串中的小写字母转换成大写字母。这个过程可以通过遍历字符串,每遇到一个小写字母便将其转换成大写字母。这个过程可以使用 ASCII 码表来实现,因为小写字母和大写字母之间的 ASCII ...

    pb_函数_将小写数字转换成大写数字

    ### pb_函数_将小写数字转换成大写数字 #### 概述 本文档介绍了一个PB(PowerBuilder)函数,该函数用于将阿拉伯数字(小写数字)转换为中文大写数字。此功能在财务、银行以及其他需要精确且正式表示金额的场景中...

    c语言小程序(人民币小写金额转换成大写金额)

    在C语言编程中,开发一个小程序来将人民币的小写金额转换为大写金额是一项常见的任务,尤其在财务软件或银行系统中。这个程序的核心在于理解人民币金额的表示规则,并将其与C语言的数据处理和字符串操作相结合。下面...

    c#写的小写人民币转换成大写人民币

    根据提供的文件信息,本文将详细解释如何使用C#语言实现小写人民币数字转换为大写人民币数字的功能。此过程涉及到的编码技术、算法设计及实际应用场景等知识点。 ### C#编程语言简介 C#(发音为 "C Sharp")是由...

    EXCEL电子表格小写人民币转换成大写知识.pdf

    在Excel电子表格中,将小写人民币转换成大写是一项常见的财务操作,特别是在编制财务报表或填写支票时。以下是一些关于如何在Excel中实现这一转换的关键知识点: 1. **推荐公式1**: 这个公式首先检查数值是否为...

    C语言成序设计__实现人民币小写金额与大写金额的转换

    本文中,我们将使用C语言实现人民币小写金额与大写金额的转换。 在中国,人民币的小写金额与大写金额的转换是一种常见的需求。例如,我们可以输入1002300.90,并将其转换为大写金额“壹佰零拾零万贰仟三佰零拾零元...

    EXCEL实现将小写转换为大写

    这个函数将输入的数值扩大100倍,进行四舍五入,然后截取出整数部分、十分位和百分位,将其转换为中文大写,并将结果返回。 使用自定义函数的优点 使用自定义函数实现小写转换为大写有很多优点。首先,自定义函数...

    小写人民币转大写人民币

    在IT行业中,尤其是在财务软件开发或者自动化处理财务数据时,将小写人民币金额转换为大写人民币是一项常见的需求。这主要是因为在中国的财务规范中,正式的财务凭证和合同通常要求使用大写数字来表示金额,以防止...

    用c语言将小写字母变大写字母

    根据给定的信息,我们可以深入探讨如何使用C语言(尽管题目提到的是C++,但实际代码是基于C语言的)来实现将字符串中的小写字母转换为大写字母的功能。这涉及到字符编码、条件判断以及字符串处理等核心概念。 ### ...

    把大写金额转换成小写的

    总结起来,大写金额转换成小写是金融数据处理的一个基础环节,涉及到对数字和单位的理解,以及适当的算法设计。通过学习和掌握这一技能,我们可以更好地处理与财务相关的数据,提高工作效率,同时降低出错风险。

    小写金额转换成大写金额

    本篇文章将详细讲解如何用PB(PowerBuilder)编程语言编写一个函数,将小写金额转换成大写金额。 首先,我们需要了解中国金融领域的大写金额书写规则。在中国,大写数字用于财务记录,以防止篡改或误解。大写数字...

    BAT批处理脚本-格式转换-人民币金额小写转大写.cmd.zip

    这个压缩包中包含的"人民币金额小写转大写.cmd.txt"文件,就是这样一个批处理脚本,用于将输入的人民币金额小写数字自动转换成大写汉字。由于安全考虑,原文件被暂时改为了TXT格式,使用时需要将其文件扩展名改为"....

    人民币金额小写转大写

    "人民币金额小写转大写"是一个常见的需求,它涉及到将阿拉伯数字(小写)转换成中文汉字(大写),以减少书写错误和欺诈的风险。在.NET框架下,C#语言提供了丰富的功能来处理这种转换。 首先,我们需要理解人民币...

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

    在Oracle数据库中,有时我们需要将数字金额转换成中文大写形式,特别是在财务系统中,这样的功能非常实用且常见。本文将详细介绍一个自定义的Oracle函数`money_to_chinese`,该函数能够将小写金额(数字)转换为中文...

    怎么用Excel将小写金额转换成人民币的大写金额

    我的工作经常需要实现这个功能,以往需要手工转换,过去也找过一些小程序进行转换,不过在小程序中显示好好的字符拷进excel中竟成了乱码,现在有了这个公式,不用自己设置函数,直接拷贝+替换就完成。很棒! 在...

    人民币金额小写转换大写

    在IT行业中,尤其是在财务软件开发或者处理金融数据时,经常需要将人民币金额的小写形式转换为大写形式,因为在中国,大写数字常用于正式的财务文档,如支票、合同等,以防止篡改。这个任务涉及到字符串处理、字符...

Global site tag (gtag.js) - Google Analytics