首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

~小写转大写

2012-02-14 
求救~求救~小写转大写写一个能实现小写金额转换为大写金额的类。(完整的程序代码,谢谢。) [解决办法]参考htt

求救~求救~小写转大写
写一个能实现小写金额转换为大写金额的类。(完整的程序代码,谢谢。)


[解决办法]
参考

http://blog.chinaunix.net/u/5033/showart.php?id=38817

/**
* @brief 将源字符串中的小写金额转换为大写格式
*
* @param dest 目的字符串
* @param src 小写金额字符串
* @return
* - NULL 源字符串的格式错误,返回NULL
* - 非NULL 目的字符串的首地址
* @note 转换根据:中国人民银行会计司编写的最新《企业、银行正确办理支付结算
* 指南》的第114页-第115页
*/
char* chineseFee( char* dest, char* src )
{
enum
{
START, //开始
MINUS, //负号
ZEROINT, //0整数
INTEGER, //整数
DECIMAL, //小数点
DECIMALfRACTION, //小数位
END, //结束
ERROR //错误
} status = START;

struct
{
int minus; //0为正,1为负
int sizeInt;
int sizeDecimal;
int integer[10];
int decimal[10];
} feeInfo;

char* NumberChar[] =
{ "零 ", "壹 ", "贰 ", "叁 ", "肆 ", "伍 ", "陆 ", "柒 ", "捌 ", "玖 " };
char* UnitChar[] =
{ "整 ", "圆 ", "拾 ", "佰 ", "仟 ", "万 ", "拾 ", "佰 ", "仟 ", "亿 ",
"拾 ", "佰 ", "仟 ", "万亿 ", "拾 ", "佰 ", "仟 ", "亿亿 ",
"角 ", "分 ", "负 ", "人民币 " };

int i, j,size; //循环变量
int zeroTag = 0, //0标志
decZeroTag = 0;

char* pDest = dest;
char* pSrc = src;

int* pInt = feeInfo.integer;
int* pDec = feeInfo.decimal;

//初始化
feeInfo.sizeInt = 0;
feeInfo.sizeDecimal = 0;
feeInfo.minus = 0;

//分析字符串
while( 1 )
{
switch ( *pSrc )
{
case '- ' :
status = ( status == START ) ? MINUS : ERROR;
feeInfo.minus = ( status == MINUS ) ? 1 : 0;
break;
case '1 ' :
case '2 ' :
case '3 ' :
case '4 ' :
case '5 ' :
case '6 ' :
case '7 ' :
case '8 ' :
case '9 ' :
case '0 ' :
if ( *pSrc == '0 ' && status == ZEROINT )//|| status == START ) )
{
status = ERROR;
break;
}
if ( status == MINUS || status == START || status == INTEGER )
{
if ( *pSrc == '0 ' && ( status == MINUS || status == START ) )
status = ZEROINT;
else
status = INTEGER;
*pInt = (*pSrc) - 48;
++pInt;
++feeInfo.sizeInt;
}
else if ( status == DECIMAL || status == DECIMALfRACTION )
{
status = DECIMALfRACTION;
*pDec = (*pSrc) - 48;


++pDec;
++feeInfo.sizeDecimal;
}
else
{
status =ERROR;
}
break;
case '. ' :
status = ( status == INTEGER || status == ZEROINT )
? DECIMAL : ERROR;
break;
case ' ' :
status = ( status == INTEGER || status == DECIMALfRACTION
|| status == ZEROINT ) ? END : ERROR;
break;
default :
status = ERROR;
}
if ( status == END )
break;
else if ( status == ERROR )
return NULL;

++pSrc;
}

//只有1位小数时,设置百分位为0,使下面代码不需要区分这两种情况
if ( feeInfo.sizeDecimal == 1 )
{
feeInfo.decimal[ 1 ] = 0;
++feeInfo.sizeDecimal;
}

//判断是否需要打印小数部分,有小数部且十分位和百分位不都为0
//需要打印小数部时,zeroTag设为0,否则设为1
if ( feeInfo.sizeDecimal == 0 //没有小数
|| ( !feeInfo.decimal[ 0 ] && !feeInfo.decimal[ 1 ] ) ) //小数部都为0
decZeroTag = 1;
else
decZeroTag = 0;

//printf( "int size: %d decimal size: %d ", feeInfo.sizeInt, feeInfo.sizeDecimal );

strcpy( pDest, UnitChar[ 21 ] ); //初始化目标字符串-人民币

if ( feeInfo.minus ) strcat( pDest, UnitChar[ 20 ] ); //负号

//处理整数部分
size = feeInfo.sizeInt;
for( i = 0; i < size; ++i )
{
j = size - i - 1 & 0x3; //j = 0时为段尾
if ( feeInfo.integer[ i ] == 0 && j ) //处理非段尾0
{
zeroTag = 1;
}
else if ( feeInfo.integer[ i ] == 0 && !j ) //处理段尾0
{
if ( feeInfo.sizeInt == 1 && decZeroTag ) //特殊处理个位0
strcat( pDest, NumberChar[ feeInfo.integer[ i ] ] );
if ( feeInfo.sizeInt != 1 || decZeroTag )
strcat( pDest, UnitChar[ size - i ] );
zeroTag = 0;
}
else //处理非0
{
if ( zeroTag )
{
strcat( pDest, NumberChar[ 0 ] );
zeroTag = 0;
}
strcat( pDest, NumberChar[ feeInfo.integer[ i ] ] );
strcat( pDest, UnitChar[ size - i ] );
if ( !j ) zeroTag = 0; //如果是段尾,设为非标志
}
}

if ( decZeroTag )
{
strcat( pDest, UnitChar[ 0 ] );//没有小数部,打印 "整 "字符
}
else
{
//十分位
if ( feeInfo.decimal[ 0 ] )
{
strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );
strcat( pDest, UnitChar[ 18 ] );
}
else if ( feeInfo.sizeInt != 1 || feeInfo.integer[ 0 ] )
{
strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );
}

//百分位不为0时
if ( feeInfo.decimal[ 1 ] )
{
strcat( pDest, NumberChar[ feeInfo.decimal[ 1 ] ] );
strcat( pDest, UnitChar[ 19 ] );
}
}
return dest;
}


[解决办法]
#include <boost/regex.hpp>


using namespace boost;
#include <boost\assign\list_of.hpp>
using namespace boost::assign;

string num[] = { "0 ", "1 ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 "};
string tab[] = { " ", "s ", "b ", "q ", "w ", "s ", "b ", "q ", "y ", "s ", "b ", "q ", "w ", "s ", "b ", "q ", "y "};
map <char, string> convert_table = list_of <pair <char, string> > ( 's ', "十 ")( 'b ', "百 ")( 'q ', "千 ")( 'w ', "万 ")( 'y ', "亿 ")
( '0 ', "零 ")( '1 ', "一 ")( '2 ', "二 ")( '3 ', "三 ")( '4 ', "四 ")( '5 ', "五 ")( '6 ', "六 ")( '7 ', "七 ")( '8 ', "八 ")( '9 ', "九 ");

string Convert(char c)
{
map <char, string> ::iterator iter = convert_table.find(c);
return (iter != convert_table.end()) ? iter-> second : string(&c, 1);
}
int main(void)
{
int x = 300000008;//001010;
int bit = 0;
string r;
while (x > 0)
{
r = num[x%10] + tab[bit] + r;
x /= 10;
++bit;
}
cout < < r < < endl;
r = regex_replace(r, regex( "(0(s|b|q))+0? "), "0 ");
cout < < r < < endl;
r = regex_replace(r, regex( "(? <=y|w)0(w|y)|0\\z|(? <!y|w)0(w|y)|(1s) "), "(?2$2)(?3s) ", format_all);
cout < < r < < endl;
for (string::size_type pos = 0; pos != r.size(); ++pos)
{
cout < < Convert(r[pos]);
}
system( "pause ");

return 0;
}

[解决办法]
char *NumToBigform(double rmb)
{
if(rmb <0) return NULL;
static char *CCC[10]={ //Capital form of Chinese character
"零 ", "壹 ", "贰 ", "叁 ", "肆 ", "伍 ", "陆 ", "柒 ", "捌 ", "玖 "};
static char *QQQ[19]={ "分 ", "角 ", ". ", "圆 ", "拾 ", "佰 ", "仟 ", "万 ", "拾 ", "佰 ", "仟 ", "亿 ",
"拾 ", "佰 ", "仟 ", "万 ", "拾 ", "佰 ", "仟 "};
static char result[256],tmp[256]; //tmp存放小写形式,result存放大写结果
sprintf(tmp, "%.2lf ",rmb); //将输入数转化为两位小数的字符串形式,即使是整数,后面也要补两个0
if(strlen(tmp)> 19)return NULL;
int i=strlen(tmp)-1,c;
char *srcPtr=tmp,*dstPtr=result;
bool bPrevZero=false; //判断result数组末尾是否为‘零’,不是‘零’则取false
for(; *srcPtr; srcPtr++,i--)
{

if(*srcPtr== '. ') continue;
c=*srcPtr- '0 ';
if(c!=0)
{
strcpy(dstPtr,CCC[c]);
dstPtr+=2;
if(srcPtr==tmp && c==1 && strcmp(QQQ[i], "拾 ")==0) dstPtr-=2;
strcpy(dstPtr,QQQ[i]);
dstPtr+=2;
bPrevZero=false;
continue;
}
if(bPrevZero) //result末尾是‘零’
{
if(strcmp(QQQ[i], "圆 ")==0 || strcmp(QQQ[i], "万 ")==0 || strcmp(QQQ[i], "亿 ")==0)


{
dstPtr-=2;
*dstPtr=0;
if(strcmp(dstPtr-2, "亿 ")) {strcpy(dstPtr,QQQ[i]); dstPtr+=2;}
else if (!strcmp(QQQ[i], "圆 ")){strcpy(dstPtr,QQQ[i]); dstPtr+=2;}
bPrevZero=false;
}
}
else //result末尾不是‘零’
{
if(strcmp(QQQ[i], "圆 ") && strcmp(QQQ[i], "万 ") && strcmp(QQQ[i], "亿 "))
{
strcpy(dstPtr, "零 ");
dstPtr+=2;
bPrevZero=true;
}
else
{
strcpy(dstPtr,QQQ[i]);
dstPtr+=2;
bPrevZero=false;
}
}
}
i=strlen(result);
if(strcmp(result+i-2, "零 ")==0) result[i-2]=0;
if(strcmp(result+i-4, "圆 ")==0) strcat(result, "整 ");
tmp[0]=result[0]; tmp[1]=result[1]; tmp[2]=0;
if(strcmp(tmp, "圆 ")==0) //对小数部分的处理
{
if(result[2]==0) strcpy(result, "零圆 ");
else
{
tmp[0]=result[2]; tmp[1]=result[3]; tmp[2]=0;
return strcmp(tmp, "零 ")==0 ? result+4 : result+2 ;
}
}
return result;
}

将就用吧

[解决办法]
//52367.23
//伍万贰仟叁佰陆拾柒元贰角叁分

#include <stdio.h>
#include <string.h>

char RMB[10][3]={ "零 ", "壹 ", "贰 ", "叁 ", "肆 ", "伍 ", "陆 ", "柒 ", "捌 ", "玖 "};
char value[13][3]={ "零 ", "拾 ", "佰 ", "仟 ", "万 ", "拾 ", "百 ", "千 ", "亿 ", "拾 ", "佰 ", "仟 ", "万 "};
char faction[2][3]={ "角 ", "分 "};

void StyleChange(const char *str)
{
int i,j,k=1,t=0,s=0; //k用于指示当前操作的位置(十位、百位。。。)
int n;
char ValueSave[26][3]; //存储整数部分
char FactionValue[2][3]; //存储小数部分

n=strlen(str);
for(i=0;i <n;i++)
{
if(str[i]== '. ')
break;
}

if(i> 13)
{
printf( "对不起请输入万亿位以下的数字\n ");
return;
}
if(n-i> 3)
{
printf( "对不起请确保小数点后面两位\n ");
return;
}
strcpy(ValueSave[t++], "元 ");
if((n-i> 1&&i==1)||str[i-1]!= '0 ')
strcpy(ValueSave[t++],RMB[str[i-1]- '0 ']);

for(j=i-2;j> =0;j--) //整数部分的操作
{
if(str[j]== '0 ')
{
if(str[j+1]!= '0 ')
{
strcpy(ValueSave[t++],RMB[str[j]- '0 ']);
k++;
}
else
{
if(i> 4&&k==8)
{
strcpy(ValueSave[t++],value[k]);
}
if(i <=8&&k==4)
{
strcpy(ValueSave[t++],value[k]);
}
k++;
}
continue;
}
strcpy(ValueSave[t++],value[k++]);
strcpy(ValueSave[t++],RMB[str[j]- '0 ']);
}

k=0; //小数部分的操作
for(j=i+1;j <n;j++)
{
strcpy(FactionValue[s++],RMB[str[j]- '0 ']);
strcpy(FactionValue[s++],faction[k++]);
}

for(j=t-1;j> =0;j--)
printf( "%s ",ValueSave[j]);


for(j=0;j <s;j++)
printf( "%s ",FactionValue[j]);
printf( "\n ");
}

int main()
{
char s[17];
int n;
while(gets(s)!=NULL)
{
n=strlen(s);
if(n> 16)
{
printf( "对不起请输入万亿位以下的数字\n ");
return -1;
}
StyleChange(s);
}
return 0;
}
[解决办法]
#include <stdio.h>
int main()
{
char *ch[11];
ch[0]= "\0 ";ch[1]= "一 ";ch[2]= "二 ";ch[3]= "三 ";ch[4]= "四 ";
ch[5]= "五 ";ch[6]= "六 ";ch[7]= "七 ";ch[8]= "八 ";ch[9]= "九 ";ch[10]= "零 ";
char *dw[6];
dw[2]= "十 ";dw[3]= "百 ";dw[0]= "千 ";dw[5]= "万 ";dw[4]= "亿 ";dw[1]= "\0 ";
char number[11];int last,n,m,i,j,have;
while(1)
{
scanf( "%s ",number);
last = 1;have = 0;
for(i=0;i <11&&number[i]!= '\0 ';i++);
for(j=0;j <i;j++)
{
n = number[j]-48;
m = i-j;
if(have == 0&& m> 4 && m <9 && n) have =1;
if(last == 0 && n) printf(ch[10]);
printf(ch[n]); if(n) printf(dw[m%4]);
if(m%4 == 1)
{
if( m == 5 && have) printf(dw[5]);
if( m == 9 ) printf(dw[4]);
}
last = n;



}
printf( "\n ");
}
return 0;
}

热点排行