user-0 提问: 钱币大写金额变成小写金额

回复:
user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:以前继(piao)承(qie)谁的忘了，仅供参考： #include <afx.h> #include <stdio.h> CString ChineseCapitalMoney(double Num) {     CString szChMoney,szNum;     int iLen, iNum, iAddZero=0;     TCHAR* hzUnit[18]={_T("分"),_T("角"),_T("元"),_T("拾"),_T("佰"),_T("仟"),_T("万"),_T("拾"),_T("佰"),_T("仟"),_T("亿"),_T("拾"),_T("佰"),_T("仟"),_T("万"),_T("拾"),_T("佰"),_T("仟")};     TCHAR* hzNum[10]={_T("零"),_T("壹"),_T("贰"),_T("叁"),_T("肆"),_T("伍"),_T("陆"),_T("柒"),_T("捌"),_T("玖")};     if (-0.01<Num && Num<0.01) return _T("零元整");     szNum.Format(_T("%18.0f"), Num*100); // 最小到分     szNum.TrimLeft();     iLen=szNum.GetLength();     if(iLen>15 || iLen==0 || Num<0) return _T(""); // 数据错误返回      for(int i=0;i<iLen;i++) {         iNum=_ttoi((LPCTSTR)szNum.Mid(i,1));         if (iNum==0) {             iAddZero++;         } else {             if (iAddZero>0) szChMoney+=_T("零");             szChMoney+=hzNum[iNum];             iAddZero=0;         }         if (iNum!=0 || iLen-i==3 || iLen-i==11 || ((iLen-i+1)%8==0 && iAddZero<4)) szChMoney+=hzUnit[iLen-i-1];     }     if (szNum.Right(2)==_T("00")) szChMoney+=_T("整"); // 没有角和分     return szChMoney; } void main() {     double d;     CString s;      d=-1.0            ;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=0.0             ;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=1234501234567.89;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=1000000000000.01;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=1000000000001.00;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d= 130040600090.01;printf("%16.2f %s\n",d,ChineseCapitalMoney(d)); } //           -1.00 //            0.00 零元整 //1234501234567.89 壹万贰仟叁佰肆拾伍亿零壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分 //1000000000000.01 壹万亿元零壹分 //1000000000001.00 壹万亿零壹元整 // 130040600090.01 壹仟叁佰亿零肆仟零陆拾万零玖拾元零壹分  这个完美实现啊！！！多谢大神！

user: user-0
content: 引用 5 楼 ahacsdn 的回复:这样可以吗？ 这个只能转换不超过一万的。 如果输入时几万几亿的，应该可以把这个改一下的 比如把输入看成“_____亿_____万_____元，用这个函数读横线上的，然后读到亿就乘以一亿，读到万就乘以一万什么的。  这个函数是按照中文习惯把输入看成两个一组，数字+基数，比如”两千  三百  二十  五元“，结果就是2*1000+3*100+2*10+5*1=2325. 有几个特例： 1.入股输入”十五元“之类，十前面没有基数。 2.如果每组第一个数字是”零“”元“则组忽略。比如”三百  元整“=3*100，”两千 零五 元整“= ”两千 五元 整“=2*1000+5*1  #include<stdio.h> #include<string.h>   char* cn_base[]={"千","百","十","元","角","分"};  float ma_base[]={1000,100,10,1,0.1,0.01}; char* cn_numb[]={"九","八","七","六","五","四","三","二","一"}; int   ma_numb[]={9,8,7,6,5,4,3,2,1};  float function(char* cn_money) { 	if (cn_money[0] == '\0')  	    return 0; 	         char cur[3];   	strncpy(cur,cn_money,2); 	cur[2]='\0'; 	if( !strcmp(cur,"十") ) 	    return 10+function(&cn_money[2]);       if( !strcmp(cur,"零") || !strcmp(cur,"整") || !strcmp(cur,"元") )         return function(&cn_money[2]);              int num;     for(int pos=0;;pos++){     	if( !strcmp(cur,cn_numb[pos]) ){     		num = ma_numb[pos];     		break; 		} 	    else 	    	continue; 	} 	 	float base; 	strncpy(cur,&cn_money[2],2); 	cur[2]='\0';     for(int pos=0;;pos++){     	if( !strcmp(cur,cn_base[pos]) ){     		base = ma_base[pos];     		break; 		}     	else 		    continue;     	} 	 	return num*base+function(&cn_money[4]); }  int main() { 	char* cn_money="四千零五十三元七角五分";  	float money=function(cn_money); 	printf("%.2f",money); }  可以可以，谢谢了。

user: user-1
content: 以前继(piao)承(qie)谁的忘了，仅供参考： #include <afx.h> #include <stdio.h> CString ChineseCapitalMoney(double Num) {     CString szChMoney,szNum;     int iLen, iNum, iAddZero=0;     TCHAR* hzUnit[18]={_T("分"),_T("角"),_T("元"),_T("拾"),_T("佰"),_T("仟"),_T("万"),_T("拾"),_T("佰"),_T("仟"),_T("亿"),_T("拾"),_T("佰"),_T("仟"),_T("万"),_T("拾"),_T("佰"),_T("仟")};     TCHAR* hzNum[10]={_T("零"),_T("壹"),_T("贰"),_T("叁"),_T("肆"),_T("伍"),_T("陆"),_T("柒"),_T("捌"),_T("玖")};     if (-0.01<Num && Num<0.01) return _T("零元整");     szNum.Format(_T("%18.0f"), Num*100); // 最小到分     szNum.TrimLeft();     iLen=szNum.GetLength();     if(iLen>15 || iLen==0 || Num<0) return _T(""); // 数据错误返回      for(int i=0;i<iLen;i++) {         iNum=_ttoi((LPCTSTR)szNum.Mid(i,1));         if (iNum==0) {             iAddZero++;         } else {             if (iAddZero>0) szChMoney+=_T("零");             szChMoney+=hzNum[iNum];             iAddZero=0;         }         if (iNum!=0 || iLen-i==3 || iLen-i==11 || ((iLen-i+1)%8==0 && iAddZero<4)) szChMoney+=hzUnit[iLen-i-1];     }     if (szNum.Right(2)==_T("00")) szChMoney+=_T("整"); // 没有角和分     return szChMoney; } void main() {     double d;     CString s;      d=-1.0            ;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=0.0             ;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=1234501234567.89;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=1000000000000.01;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d=1000000000001.00;printf("%16.2f %s\n",d,ChineseCapitalMoney(d));     d= 130040600090.01;printf("%16.2f %s\n",d,ChineseCapitalMoney(d)); } //           -1.00 //            0.00 零元整 //1234501234567.89 壹万贰仟叁佰肆拾伍亿零壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分 //1000000000000.01 壹万亿元零壹分 //1000000000001.00 壹万亿零壹元整 // 130040600090.01 壹仟叁佰亿零肆仟零陆拾万零玖拾元零壹分

user: user-1
content: 继(piao)承(qie)5楼：//按照中文习惯把输入看成两个一组，数字+基数，比如”贰千  叁百  贰拾  伍元”，结果就是2*1000+3*100+2*10+5*1=2325. //有几个特例： //1.如果输入“拾伍元”之类，拾前面没有基数。 //2.如果每组第一个数字是“零”“元”则组忽略。比如“叁百  元整”=3*100，“贰仟 零伍 元整”= “贰仟 伍元 整”=2*1000+5*1 #include <stdio.h> #include <string.h> char* cn_base[]={"仟","佰","拾","元","角","分"}; double ma_base[]={1000.0,100.0,10.0,1.0,0.1,0.01}; char* cn_numb[]={"玖","捌","柒","陆","伍","肆","叁","贰","壹"}; int   ma_numb[]={9,8,7,6,5,4,3,2,1}; double qian(char* cn_money) {     if (cn_money[0]=='\0') return 0.0;     if (!strncmp(cn_money,"拾",2)) return 10.0+qian(cn_money+2);     if (!strncmp(cn_money,"零",2) || !strncmp(cn_money,"整",2) || !strncmp(cn_money,"元",2)) return qian(cn_money+2);      int num,i;     for (i=0;i<9;i++){         if (!strncmp(cn_money,cn_numb[i],2)) {             num = ma_numb[i];             break;         } else continue;     }      if (cn_money[2]=='\0') return (double)num;          double base;     for (i=0;i<6;i++){         if (!strncmp(cn_money+2,cn_base[i],2)) {             base = ma_base[i];             break;         } else continue;     }     return num*base+qian(cn_money+4); } double convert(char* cn_money) {     char *p,*q;     double d;      d=0.0;     q=cn_money;     p=strstr(q,"万");     if (p) {         if (strstr(p+2,"亿")) {             p[0]=0;             d=10000.0*qian(q);             q=p+2;         }     }     p=strstr(q,"亿");     if (p) {         p[0]=0;         d=100000000.0*(d+qian(q));         q=p+2;     }     p=strstr(q,"万");     if (p) {         p[0]=0;         d=d+10000.0*qian(q);         q=p+2;     }     d+=qian(q);     return d; } int main() {     char cn_money1[]="壹万贰仟叁佰肆拾伍亿零壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分";     double money1=convert(cn_money1);     printf("%.2lf\n",money1);     char cn_money2[]="壹仟叁佰亿零肆仟零陆拾万零玖拾元零壹分";     double money2=convert(cn_money2);     printf("%.2lf\n",money2);     return 0; } //1234501234567.89 //130040600090.01 //

user: user-2
content: 引用 5 楼 ahacsdn 的回复:这样可以吗？ 这个只能转换不超过一万的。 如果输入时几万几亿的，应该可以把这个改一下的 比如把输入看成“_____亿_____万_____元，用这个函数读横线上的，然后读到亿就乘以一亿，读到万就乘以一万什么的。  这个函数是按照中文习惯把输入看成两个一组，数字+基数，比如”两千  三百  二十  五元“，结果就是2*1000+3*100+2*10+5*1=2325. 有几个特例： 1.入股输入”十五元“之类，十前面没有基数。 2.如果每组第一个数字是”零“”元“则组忽略。比如”三百  元整“=3*100，”两千 零五 元整“= ”两千 五元 整“=2*1000+5*1  #include<stdio.h> #include<string.h>   char* cn_base[]={"千","百","十","元","角","分"};  float ma_base[]={1000,100,10,1,0.1,0.01}; char* cn_numb[]={"九","八","七","六","五","四","三","二","一"}; int   ma_numb[]={9,8,7,6,5,4,3,2,1};  float function(char* cn_money) { 	if (cn_money[0] == '\0')  	    return 0; 	         char cur[3];   	strncpy(cur,cn_money,2); 	cur[2]='\0'; 	if( !strcmp(cur,"十") ) 	    return 10+function(&cn_money[2]);       if( !strcmp(cur,"零") || !strcmp(cur,"整") || !strcmp(cur,"元") )         return function(&cn_money[2]);              int num;     for(int pos=0;;pos++){     	if( !strcmp(cur,cn_numb[pos]) ){     		num = ma_numb[pos];     		break; 		} 	    else 	    	continue; 	} 	 	float base; 	strncpy(cur,&cn_money[2],2); 	cur[2]='\0';     for(int pos=0;;pos++){     	if( !strcmp(cur,cn_base[pos]) ){     		base = ma_base[pos];     		break; 		}     	else 		    continue;     	} 	 	return num*base+function(&cn_money[4]); }  int main() { 	char* cn_money="四千零五十三元七角五分";  	float money=function(cn_money); 	printf("%.2f",money); }  好多错字大侠莫怪

user: user-2
content: 这样可以吗？ 这个只能转换不超过一万的。 如果输入时几万几亿的，应该可以把这个改一下的 比如把输入看成“_____亿_____万_____元，用这个函数读横线上的，然后读到亿就乘以一亿，读到万就乘以一万什么的。  这个函数是按照中文习惯把输入看成两个一组，数字+基数，比如”两千  三百  二十  五元“，结果就是2*1000+3*100+2*10+5*1=2325. 有几个特例： 1.入股输入”十五元“之类，十前面没有基数。 2.如果每组第一个数字是”零“”元“则组忽略。比如”三百  元整“=3*100，”两千 零五 元整“= ”两千 五元 整“=2*1000+5*1  #include<stdio.h> #include<string.h>   char* cn_base[]={"千","百","十","元","角","分"};  float ma_base[]={1000,100,10,1,0.1,0.01}; char* cn_numb[]={"九","八","七","六","五","四","三","二","一"}; int   ma_numb[]={9,8,7,6,5,4,3,2,1};  float function(char* cn_money) { 	if (cn_money[0] == '\0')  	    return 0; 	         char cur[3];   	strncpy(cur,cn_money,2); 	cur[2]='\0'; 	if( !strcmp(cur,"十") ) 	    return 10+function(&cn_money[2]);       if( !strcmp(cur,"零") || !strcmp(cur,"整") || !strcmp(cur,"元") )         return function(&cn_money[2]);              int num;     for(int pos=0;;pos++){     	if( !strcmp(cur,cn_numb[pos]) ){     		num = ma_numb[pos];     		break; 		} 	    else 	    	continue; 	} 	 	float base; 	strncpy(cur,&cn_money[2],2); 	cur[2]='\0';     for(int pos=0;;pos++){     	if( !strcmp(cur,cn_base[pos]) ){     		base = ma_base[pos];     		break; 		}     	else 		    continue;     	} 	 	return num*base+function(&cn_money[4]); }  int main() { 	char* cn_money="四千零五十三元七角五分";  	float money=function(cn_money); 	printf("%.2f",money); }

user: user-3
content: 1 以元角分为分隔符提取相应的数字 2 对每个提取的数字, 使用拾、佰、仟、万、亿为分隔符提取 3 壹、贰、叁、肆、伍、陆、柒、捌、玖转为对应1-9

user: user-0
content: 可以说下思路么

user: user-4
content: 1)个十百千万亿的处理，以及某一个十进制位的处理 2）元角分的处理 3）0 的处理 解决好这些，基本就可以了

user: user-5
content: 这个细节太多，且要统一中文货币的表达形式~