C++将阿拉伯数字转换为大写的中文数字,求修改指正
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++将阿拉伯数字转换为大写的中文数字,求修改指正相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<string.h>
using namespace std;
#include<stdlib.h>
int main()
int year,month,day,number,len,i=0;
char name[20];
char money[13],char daxie[13];
cout<<"请输入年份:";
cin>>year;
system("cls");
cout<<"请输入月份:";
cin>>month;
system("cls");
cout<<"请输入日份:";
cin>>day;
system("cls");
cout<<"请输入您的姓名:";
cin>>name;
system("cls");
cout<<"请输入支票数量:";
cin>>number;
system("cls");
cout<<"请输入支票的金额:";
cin>>money;
len=strlen(money);
system("cls");
while(money>10000)
cout<<"输入有误!请确保输入的金额小于10000元..."<<endl;
cout<<"请再次输入支票的金额:";
cin>>money;
system("cls");
for(;i<len;i++)
case'0':daxie[i]='零';
case'1':daxie[i]='壹';
case'2':daxie[i]='贰';
case'3':daxie[i]='叁';
case'4':daxie[i]='肆';
case'5':daxie[i]='伍';
case'6':daxie[i]='陆';
case'7':daxie[i]='柒';
case'8':daxie[i]='扒';
case'9':daxie[i]='玖';
cout<<"支票具体信息如下:"<<endl;
cout<<"日期:"<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"支票的数量:"<<number<<endl;
cout<<"支票的金额:"<<daxie<<endl;
return 0;
改的价值不大,从语法到逻辑,都有不少问题,建议重写一个吧。
汉字不是一个字符,不能用char赋值
缺少了switch
字符串不能直接和10000比较
缺少“个十百千万”的汉字,大写的没法看
没有处理连续0的情况,一万零四十 这样的输入要处理多个0.
那你告诉我汉字该怎么处理?
追答//int64长整数改大写数字 coding by bhtzu#include<stdio.h>
#include<math.h>
#include<string.h>
#define LSCANF(X) scanf("%I64d",&X)
typedef __int64 LINT;
int main()
char* sNum[]="零","壹","贰","叁","肆","伍","陆","柒","捌","玖";
char* sBit[]="","拾","佰","仟";
char* sTep[]="","万","亿","万","亿","万","亿";
char* blank=" ";
char input[100];
char output[500];
LINT m,n,i,j,isZero=0;
LSCANF(m);
while(m>=0)//输入负数结束
memset(output,0,500);
j=m;
n = (LINT)log10((double)j)+1;
for(i=0;i<n;i++,j=j/10)
input[i] = (char)(j%10);
for(i=n-1;i>=0;i--)
j=input[i];
if(j==0)
isZero=1;
else if(j>0&&isZero==1)//N 个零完事了
strcat(output,sNum[0]);
isZero=0;
if (j>0)
strcat(output,sNum[j]);
strcat(output,sBit[(i)%4]);
if(i%4==0)
strcat(output,sTep[i/4]);
isZero=0;
if(strlen(output)==0)
strcat(output,sNum[0]);
printf("%s\\n",output);
LSCANF(m);
return 0;
这是我曾经写的处理大数中文写法的代码,你参考一下吧。
参考技术A 一、case只能在switch语句,你的switch呢??二、每条case语句后一般要加break,否则会顺序执行下去,除非你有特殊用处
三、汉字在内存中一般是用2字节存放的,你用char明显表示不了。
四、字符串不能直接和10000比较
Java中金额数字转换为大写数字
注:该代码来自于别人,我引入进来并修改了里面的几个bug.现在写进我的博客里,以便于日后查看,和为其它博友们提供方便
修改bug地方:1.金额为0时,不加整。以前是零元整,现在是零元 2.修改"分", "角", "元","万", "亿","兆"位不会出现零
package com.zbx.bs.common.util;
import java.math.BigDecimal;
/**
* 数字转换为汉语中人民币的大写<br>
*
* @author dean
*/
public class NumberToCN {
/**
* 汉语中数字大写
*/
private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
/**
* 汉语中货币单位大写,这样的设计类似于占位符
*/
private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
"佰", "仟", "兆", "拾", "佰", "仟" };
/**
* 特殊字符:整
*/
private static final String CN_FULL = "整";
/**
* 特殊字符:负
*/
private static final String CN_NEGATIVE = "负";
/**
* 金额的精度,默认值为2
*/
private static final int MONEY_PRECISION = 2;
/**
* 特殊字符:零元整
*/
private static final String CN_ZEOR_FULL = "零元";
/**
* 把输入的金额转换为汉语中人民币的大写
*
* @param numberOfMoney
* 输入的金额
* @return 对应的汉语大写
*/
public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {
StringBuffer sb = new StringBuffer();
// 返回-1:表示该数小于0 0:表示该数等于0 1:表示该数大于0
int signum = numberOfMoney.signum();
// 零元的情况
if (signum == 0) {
return CN_ZEOR_FULL;
}
// 这里会进行金额的四舍五入
long number = numberOfMoney.movePointRight(MONEY_PRECISION).setScale(0, 4).abs().longValue();
// 得到小数点后两位值
long scale = number % 100;
int numUnit = 0;
int numIndex = 0;
boolean getZero = false;
// 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
if (!(scale > 0)) {
numIndex = 2;
number = number / 100;
getZero = true;
}
if ((scale > 0) && (!(scale % 10 > 0))) {
numIndex = 1;
number = number / 10;
getZero = true;
}
int zeroSize = 0;
while (true) {
if (number <= 0) {
break;
}
// 每次获取到最后一个数
numUnit = (int) (number % 10);
if (numUnit > 0) {
if ((numIndex == 9) && (zeroSize >= 3)) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
}
if ((numIndex == 13) && (zeroSize >= 3)) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
}
sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
sb.insert(0, CN_UPPER_NUMBER[numUnit]);
getZero = false;
zeroSize = 0;
} else {
++zeroSize;
//"分", "角", "元","万", "亿","兆"位不会出现零
if (numIndex != 0 && numIndex != 1 && numIndex != 2
&& numIndex != 6 && numIndex != 10 && numIndex != 14) {
if (!(getZero)) {
sb.insert(0, CN_UPPER_NUMBER[numUnit]);
}
}
if (numIndex == 2) {
if (number > 0) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
}
} else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {
sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
}
getZero = true;
}
// 让number每次都去掉最后一个数
number = number / 10;
++numIndex;
}
// 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
if (signum == -1) {
sb.insert(0, CN_NEGATIVE);
}// 除了0.00其他数据都要带特殊字符:整
sb.append(CN_FULL);
return sb.toString();
}
public static void main(String[] args) {
double money = 8880044841.10;
BigDecimal numberOfMoney = new BigDecimal(money);
System.out.println("你输入的金额为:【" + money + "】 #--# [" + NumberToCN.number2CNMontrayUnit(numberOfMoney).toString() + "]");
}
}
以上是关于C++将阿拉伯数字转换为大写的中文数字,求修改指正的主要内容,如果未能解决你的问题,请参考以下文章