例如:1111,2222,3333
读作:一千一百一十一亿二千二百二十二万三千三百三十三
#pragma once class CConvert { public: CConvert(void); virtual ~CConvert(void); public: bool getoutcome(char* result, char* input); static char table[10][4]; private: void remove0(char* input, char* output); bool convert9999(char* result, char* input); bool convert99999999(char* result, char* input); bool convert999999999999(char* result, char* input); void mid(char* dest, char* sour, int start, int len); }; #include "StdAfx.h" #include "Convert.h" #include "string.h" #include "stdio.h" #include "stdlib.h" char CConvert::table[10][4] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; CConvert::CConvert(void) { } CConvert::~CConvert(void) { } //把 souce 从 start 开始的 len 个字符拷贝到 dest 中来 void CConvert::mid(char* dest, char* sour, int start, int len) { for(int i = 0; i < len; i++) { *(dest + i) = *(sour + start + i); } *(dest + len) = '\0'; return; } //把一个字符串开头的'0'全部删除掉,如果全部都为0,就认为只有一个字符'0' void CConvert::remove0(char* input, char* ouput) { int zero = 0; char *pstr = input; while((*pstr) == '0') { zero++; pstr++; } if (zero == strlen(input)) { strcpy_s(ouput, 50, "0"); } else { strcpy_s(ouput, 50, pstr); } } //可以处理 最大数为 9999,9999,9999 //根据不同的区间,调用不同的函数转换 bool CConvert::getoutcome(char* result, char* input) { bool ret = false; char output[50]; memset(output, 0, 50); remove0(input, output); if (strlen(output) > 12) return false; unsigned int intvalue = atoi(output); if (intvalue >= 0 && intvalue < 10000) { ret = convert9999(result, output); } else if(intvalue >= 10000 && intvalue < 100000000) { ret = convert99999999(result, output); } else { ret = convert999999999999(result, output); } return ret; } //1,0000 以内整形数的读法 //通过枚举的情况组合各种10000以内整形数的读法 //不知道有没有其他的办法 bool CConvert::convert9999(char* result, char* input) { bool ret = false; remove(input); char output[50]; memset(output, 0, 50); remove0(input, output); int length = strlen(output); if ( length > 4) return ret; unsigned short index[4]; for(int i = 0; i < length; i++) { index[i] = output[i] - 48; } unsigned int intvalue = atoi(input); if (intvalue >= 0 && intvalue < 10) // range from 0 to 10 { sprintf_s(result, 50, "%s",table[index[0]]); } else if(intvalue >= 10 && intvalue < 100) //range from 10 to 100 { if (index[1] == 0)//10 { sprintf_s(result, 50, "%s%s",table[index[0]],"十"); } else//11 { sprintf_s(result, 50, "%s%s%s",table[index[0]],"十", table[index[1]]); } } else if(intvalue >= 100 && intvalue < 1000) //range from 100 to 1000 { if (index[1] == 0 && index[2] == 0) //100 { sprintf_s(result, 50, "%s%s",table[index[0]],"百"); } else if(index[1] != 0 && index[2] == 0)//110 { sprintf_s(result, 50, "%s%s%s%s",table[index[0]],"百", table[index[1]], "十" ); } else if(index[1] == 0 && index[2] != 0)//101 { sprintf_s(result, 50, "%s%s%s",table[index[0]],"百零",table[index[2]] ); } else//111 { sprintf_s(result, 50, "%s%s%s%s%s",table[index[0]],"百",table[index[1]],"十", table[index[2]]); } } else if(intvalue >=1000 && intvalue < 10000) //range from 1000 to 10000 { //四位数 3 个 0 在其中 if (index[1] == 0 && index[2] == 0 && index[3] == 0)//1000 { sprintf_s(result, 50, "%s%s",table[index[0]],"千"); } //四位数有两个 0 在 其中 else if(index[1] == 0 && index[2] == 0 && index[3] != 0 )//1001 { sprintf_s(result, 50, "%s%s%s",table[index[0]],"千零",table[index[3]] ); } else if(index[1] != 0 && index[2] == 0 && index[3] == 0 )//1100 { sprintf_s(result, 50, "%s%s%s%s",table[index[0]],"千",table[index[1]],"百" ); } else if(index[1] == 0 && index[2] != 0 && index[3] == 0 )//1010 { sprintf_s(result,50, "%s%s%s%s",table[index[0]],"千零",table[index[2]],"十"); } //四位数有且仅有一个0在其中 else if(index[1] == 0 && index[2] != 0 && index[3] != 0 )//1011 { sprintf_s(result,50, "%s%s%s%s%s",table[index[0]],"千零",table[index[2]],"十", table[index[3]]); } else if(index[1] != 0 && index[2] == 0 && index[3] != 0 )//1101 { sprintf_s(result,50, "%s%s%s%s%s",table[index[0]],"千",table[index[1]],"百零", table[index[3]]); } else if(index[1] != 0 && index[2] != 0 && index[3] == 0 )//1110 { sprintf_s(result,50, "%s%s%s%s%s%s",table[index[0]],"千",table[index[1]],"百", table[index[2]],"十"); } //四位数不存在0的情况 else//1111 { sprintf_s(result, 50, "%s%s%s%s%s%s%s",table[index[0]],"千",table[index[1]],"百",table[index[2]],"十", table[index[3]]); } } ret = true; return ret; } bool CConvert::convert99999999(char* result, char* input) { bool ret = false; char output[50]; memset(output, 0, 50); remove0(input, output); int length = strlen(output); if ( length > 8) return ret; //清空空间 char localinput[2][5]; char localresult[2][50]; memset((char*)localinput, 0, sizeof localinput); memset((char*)localresult, 0, sizeof localresult); //************************************************* //按照中国人读数字的习惯,1111,2222 //************************************************* if (strlen(output) > 4) { mid(localinput[0], output, length - 4, 4); convert9999(localresult[0], localinput[0]); mid(localinput[1], output, 0, length - 4); convert9999(localresult[1], localinput[1]); unsigned int intvalue0 = atoi(localinput[0]); if (intvalue0 == 0) { sprintf_s(result, 50, "%s%s", localresult[1],"万"); } else if(intvalue0 >= 1 && intvalue0 < 1000) { sprintf_s(result, 50, "%s%s%s", localresult[1],"万零",localresult[0]); } else if(intvalue0 >= 1000) { sprintf_s(result, 50, "%s%s%s", localresult[1],"万",localresult[0]); } } else { mid(localinput[0], output, 0, length); convert9999(localresult[0], localinput[0]); strcpy_s(result, 50, localresult[0]); } ret = true; return ret; } bool CConvert::convert999999999999(char* result, char* input) { bool ret = false; char output[50]; memset(output, 0, 50); remove0(input, output); int length = strlen(output); if (length > 12) return ret; //清空空间 char localinput[2][9]; char localresult[2][50]; memset((char*)localinput, 0, sizeof localinput); memset((char*)localresult, 0, sizeof localresult); //************************************************* //按照中国人读数字的习惯,1111,2222,3333 //************************************************* mid(localinput[0], output, length - 8, 8); convert99999999(localresult[0], localinput[0]); mid(localinput[1], output, 0, length - 8); convert9999(localresult[1], localinput[1]); unsigned int intvalue0 = atoi(localinput[0]); if (intvalue0 == 0) { sprintf_s(result, 50, "%s%s", localresult[1],"亿"); } else if(intvalue0 >= 1 && intvalue0 < 10000000) { sprintf_s(result, 50, "%s%s%s", localresult[1],"亿零",localresult[0]); } else if(intvalue0 >= 10000000) { sprintf_s(result, 50, "%s%s%s", localresult[1],"亿",localresult[0]); } ret = true; return ret; }
主函数:
#include "stdafx.h" #include "Convert.h" #include "string.h" int _tmain(int argc, _TCHAR* argv[]) { CConvert con; char input[15]="1122223333"; char result[50]=""; memset(result, 0, 50); con.getoutcome(result, input); printf("%s\n", result); getchar(); return 0; }