人民币转换

描述: 

考试题目和要点:

1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。(30分) 

2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,如¥ 532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。(30分) 

3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,中文大写金额中间只写一个“零”字,如¥6007.14,应写成“人民币陆仟零柒元壹角肆分“。(

 

 
知识点:  字符串 
题目来源:  内部整理 
练习阶段:  初级 
运行时间限制: 10Sec
内存限制: 128MByte
输入:  

输入一个doulbe数

 
输出:  

输出人民币格式

注:

下面乱码为:

人民币拾伍万壹仟壹佰贰拾壹元壹角伍分

 
 人民币拾伍万壹仟壹佰贰拾壹元壹角伍分 
 
样例输入:
151121.15

                   
样例输出:
�����ʰ����ҼǪҼ�۷�ʰҼԪҼ�����

                    

首先,看到输入类型为double,就应该考虑截取double 类型的小数点后2位,保留到分。然后有个整字, 说明对于没有小数的要加个整字来说明。好吧,描述第二点说到了这些。

然后第三点很有意思,当有多个0时,只写出一个0,这个其实很容易实现。

然后应该没有什么要注意的地方了。


思路:

首先,要知道其位数,位数的判断由于这里没有对效率的过度要求,所以我经常用时间来换取设计的简单,这里写一个 将位数转换为中文的亿万百的函数。然后又考虑到截取小数点,这里最好的方法是将读取的double类型作为string类型储存,然后分成两端,小数点左端来使用转换函数转换称正确的文字,函数使用迭代,这样为更好看一点。迭代如何解决0的问题,以及,这里又出现如果前几位数字为0应该如何处理。在每次对非0数字处理后,检测下一位是否为0,如果是在字符串后加0,然后函数遇0跳过。对于小数点右边的两位,只要简单的将两位通过if语句即可获取结果。

这里关于数字转换成中文的思路是不正确的,中文一般是以4个单位为一组,所以应该将数字按4位进行分割,以获得其正确格式,然后加上对应的这4位的位数,0,万,亿。

题目中又说到当数字中间有0才用零表示,而对于0一直到结束,这是不需要写 零出来的,但是这样就需要使用一个0位标识或者换其他思路即不能使用4位分割。若使用4位分割则需要从最低位来开始转换。


写出代码:



c++中double类型转string类型的方法,使用stringstream 

stringstream ss;
string str="";
string output = "";
ss<<d;
ss>>str;

这种方法是不正确的,当数位较多时,会自动转换为坑爹的科学计数法。


string的find函数,返回下标,但对于未找到,使用string中的npos常量 。


编写中遇到许多错误,不详述了,其中一个,示例居然给的读作 十五万,而不是一十五万,较坑。

#include <iostream>;
#include <string>
#include <sstream>

using namespace std;
string ZH[] =  {  "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
//这个函数只能处理四位数据,未满四位,补x,从qian往hou看所以一开始zero为否,不加0,遇数字为真,加零,遇0变否
string change4ToZH(string input,bool *zero){
	string str= "";

	if(input[0]!= '0' ){
		if(input[0] != 'x'){
			if(*zero == true)
				str += '零';
			str += ZH[input[0] - '1'] +"仟";
			*zero = false;
		}
	}else{
		*zero = true;
	}
	if(input[1]!= '0' ){
		if(input[1] != 'x'){
			if(*zero == true)
				str += '零';
			str += ZH[input[1] - '1'] +"佰";
			*zero = false;
		}
	}else{
		*zero = true;
	}
	if(input[2]!= '0' ){
		if(input[2] != 'x'){
			if(*zero == true)
				str += '零';
			if(input[2]!= '1')
			str += ZH[input[2] - '1'] ;
			str +="拾";
			*zero = false;
		}
	}else{
		*zero = true;
	}
	if(input[3]!= '0' ){
		if(input[3] != 'x'){
			if(*zero == true)
				str += '零';
			str += ZH[input[3] - '1'] ;
			*zero = false;
		}
	}else
		*zero = true;

	return str;
}

//将小数点左端转换为中文
string changeRightToZH(string right){
	string output = "";
	/*
	int times = right.length() / 12 + 1;
	for( int i = 0 ; i < times * 12 - right.length() ; i++){
		right = 'x' + right;//补位 
	}
	bool zero = false;
	string fourchar,yi = "";//全部的亿
	for( int i = times; i > 0 ; i -- ){
		fourchar = right.substr(12*(times -i -1),12);
		string buff = 
		}

	}
	*/
	int length =12- right.length();
	for(int i = 0 ; i<length ;i++){
		right = 'x' + right;
	}
	string buff = "";
	bool zero =false;
	buff = change4ToZH(right.substr(0,4),&zero);
	if(buff != "")
		output += buff + "亿";
	buff = change4ToZH(right.substr(4,4),&zero);
	if(buff != "")
		output += buff + "万";
	buff = change4ToZH(right.substr(8,4),&zero);
		output += buff ;
	if(output == "")
		output = "零";
	return "人民币"+output+"元";
}
//人民币转换
void main(){
	
	double d;
	cin >> d;
	string str="";
	string output = "";
	char dd[100];
	sprintf_s(dd,100,"%f",d);
	str = (string) dd;
	
	int point = str.find(".");
	string left,leftout = "";
	if(point != str.npos){
		left = str.substr(point+1);
		if(left.length() > 0 ){
			if(left[0] != '0')
				leftout +=  ZH[left[0] - '1'] + "角";
			if(left.length()>1 &&left[1] != '0')
				leftout += ZH[left[1] - '1'] + "分";
		}
		str = str.substr(0,point);
	}
	output = changeRightToZH(str);
	if(leftout =="")
		output += "整";
	else 
		output += leftout;

	cout<< output;
}


提交正确。

这道题目感觉还是比较坑的,中间我还放弃了更加完美但更加复杂的解法,即对所有位都进行计算,而不是仅仅设定其在12位即亿这个单位之内,但是那样就更加复杂麻烦了,我还是一个比较怕麻烦的人。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值