您的位置:首页 > 其它

一个将阿拉伯数字转换为中文数字近似读法的程序

2012-12-02 20:56 344 查看
偶尔突发奇想,写了一个将阿拉伯数字转换为中文数字近似值的程序:

#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 大约等于 一百二十四十兆兆兆

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: