偶尔突发奇想,写了一个将阿拉伯数字转换为中文数字近似值的程序:
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdbool.h>
#include <windows.h>
const char *ChineseNum[] = {"零","一","二","三","四",\
"五","六","七","八","九","十"};
const char *ChineseUnit[] = \
{"千","百","十","万","亿","兆"};
bool GetPreFix(const char *src,char *back)
{
if(!src || !back)
return false;
int count = strlen(src)-1,prefixcount = count%4,lastpos=0;
for(int i=0;i<prefixcount;++i)
{
if(!(lastpos==0 && (int)src[i]-0x30==0))
strcat(back,ChineseNum[(int)src[i]-0x30]);
if((int)src[i]-0x30!=0)
strcat(back,ChineseUnit[3-prefixcount+i]);
lastpos = (int)src[i]-0x30;
}
if((int)src[prefixcount]-0x30!=0)
strcat(back,ChineseNum[(int)src[prefixcount]-0x30]);
return true;
}
bool GetPostFix(const char *src,char *back)
{
if(!src || !back)
return false;
int count = strlen(src)-1,wcount = count/4;
int zcount = wcount / 3,zlastcount=wcount % 3;
switch(wcount)
{
case 0:
break;
case 1:case 2:case 3:
strcpy(back,ChineseUnit[wcount+2]);
break;
default:
strcpy(back,ChineseUnit[zlastcount+2]);
while(zcount-->0)
strcat(back,ChineseUnit[5]);
break;
}
return true;
}
void ShowChineseNearNum(const char *src)
{
if(!src)
{
printf("[%s]err : src == NULL\n",__func__);
return;
}
char backpre[] = {[128]=0};
char backpost[] = {[128]=0};
GetPreFix(src,backpre);
GetPostFix(src,backpost);
printf("%s 大约等于 %s%s\n",src,backpre,backpost);
}
int main(int argc,char *argv[])
{
if(argc != 2)
{
printf("usage : %s number\n",argv[0]);exit(1);
}
ShowChineseNearNum(argv[1]);
return 0;
}
D:\Work\SRC\c_src>cnn 124467899868068698758654675785597868968976756485967
124467899868068698758654675785597868968976756485967 大约等于 一百二十四十兆兆兆
兆