ç½ä¸æ·è´ç代ç ï¼è¿æ¯Cè¯è¨çï¼Java æè
å
¶ä»çä¹å¾å¤ï¼ä½è°ç说ï¼èªå·±ç³»ç»ç¨çä¹æ¯ç½ä¸å«äººåçãå¦æçä¸æçè¯ï¼å解éã
/**
* @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;
}