C語言實現人民幣小寫轉大寫

這個是很早以前用C語言實現的人民幣小寫轉大寫的方法函數

/****************************************************************************
 *
 * 函數名稱: 
 * 功能描述: 將用阿拉伯數字表示的金額轉換爲用中文大寫數字表示。
 *           金額範圍:-9999999999999999.99 —— 9999999999999999.99 
             數量級:  千萬億
             精確值:  小數點後兩位 
 * 輸入參數: 阿拉伯數字表示的金額
 *                      
 * 輸出參數: 中文大寫數字表示的金額
 * 返 回 值: 
 *           
 *
 ***************************************************************************
 * Who            Date       Action       Memo
 * ChengCheng			2011-07-20		cc@tkc8.com
 ***************************************************************************
 * TIP: C-Create M-Modify
 ***************************************************************************/
 
/*---------------------------- 頭文件定義 ------------------------*/
#include	<stdio.h>
#include	<string.h>
#include	<stdlib.h>
#include	<unistd.h>
/*--------------------------- 頭文件定義結束 -------------------------*/

/*------------------------ 如下內容相關函數定義 ------------------------*/

#define	MAX_SMALL_AMOUNT_LEN            19
#define	SMALL_AMOUNT_LEN                MAX_SMALL_AMOUNT_LEN
#define SMALL_PART_LEN                  2
#define	BIG_AMOUNT_LEN                  128
#define	ONE_WORD_LEN                    2
/*------------------------ 以上內容相關函數定義 ------------------------*/


/*
 *去空格
 */ 
void amount_trim ( char *s, char Mode )
{
   int  i ;
   char *p ;

   if ( s == NULL ) 
   {
      return ;
   }
   if ( strlen ( s ) == 0 )  
   {
   	  return ;
   }

   p = s ;

   switch ( toupper ( Mode ) )
   {
      case 'A':

      case 'L':
         while ( *p==' ' || *p== '\t' ) p++ ;
         strcpy ( s , p ) ;
         if(toupper ( Mode )== 'L' ){break ;}

      case 'R':
         while ( ( strlen ( s ) >= 1 ) &&
                 ( ( s [ strlen ( s ) - 1 ] == ' ' ) ||
                   ( s [ strlen ( s ) - 1 ] == '\t' ) ) )
            s [ strlen ( s ) - 1 ] = 0x00 ;
         break ;      
   }
   return ;
} 

/*
 * 檢查金額的有效性
 */
int amount_is_valid( char *buffer, int len )
{
   long ll_loop = 0;
   int	li_dots = 0;

   /* --判斷輸入參數的有效性,若是輸入參數不合法,則視爲金額無效-- */
   if( buffer == NULL || len <= 0 )
   {
      return( 0 );
   }
   else
   {
      for( ll_loop = 0; ll_loop < len; ll_loop++ )
      {
         if( ll_loop == 0 && buffer[ ll_loop ] == '-' )
         {
            continue;
         }

         if( buffer[ ll_loop ] == '.' )
         {
            li_dots++;
         }

         if(( buffer[ ll_loop ] < '0' || buffer[ ll_loop ] > '9' ) && buffer[ ll_loop ] != '.' )
         {
            return( 0 );
         }
      }
   }

   if( li_dots >= 2 )
   {
      return( 0 );
   }

   return( 1 );
}

/*
 *轉換成大寫
 */  
char * amount_switch_small_to_big( char *szNum )
{
     
   /* --定義-- */
   static char CapsBuf[ 256 ];
   char buf[ SMALL_AMOUNT_LEN + 1 ];
   char str[ BIG_AMOUNT_LEN + 1 ];
   char power[ ONE_WORD_LEN + 1 ];
   char big[ ONE_WORD_LEN + 1 ];
   int  position;
   int  point_pos;
   int  index;
   int  f_big;
   int  f_power;
   int  is_small_zero;
   int  i;
   
   /* --初始化-- */
   memset(( char * )CapsBuf, 0x00, sizeof( CapsBuf ));
   index = 0;
   position = 0;
   f_big = 0;
   f_power = 0;
   is_small_zero = 0;
   i = 0;
   point_pos = MAX_SMALL_AMOUNT_LEN - SMALL_PART_LEN - 1;
   memset(( char * )CapsBuf, 0x00, sizeof( CapsBuf ));
   memset(( char * )buf, 0x00, sizeof( buf ));
   memset(( char * )str, 0x00, sizeof( str ));
   memset(( char * )power, 0x00, sizeof( power ));
   memset(( char * )big, 0x00, sizeof( big ));

   /* --檢查輸入參數的有效性-- */
   if( !szNum || !strlen( szNum ))
   {
      return( "ERROR" );
   }
   
   /* --去空格-- */
   amount_trim( szNum, 'A' );
   
   /* --檢查金額的有效性-- */
   if( !amount_is_valid( szNum, strlen( szNum )))
   {
      return( "Invalid Amount" );	
   }
   
   /* --判斷是否爲負數-- */
   if( szNum[ 0 ] == '-') 
   {
      szNum++; 
      strcpy( CapsBuf, "負"	);
   }
   
   /* -- 格式化 -- */ 
   /* ---- 小數部分格式化 ---- */
   /* ------ 找到小數點的位置,若是沒有小數點point_pos的值爲strlen( buf ) ------ */    
   point_pos = 0;
   while( szNum[ point_pos ] != '.' && ( point_pos < strlen( szNum ) ) ) 
   {
      point_pos++;   	
   }
   if( point_pos == strlen( szNum ))
   {
      strcat( szNum, "." );
   }
   while( strlen( szNum ) - point_pos < SMALL_PART_LEN + 1 )
   {
   	  strcat( szNum, "0" ); 
   } 
   szNum[ point_pos + SMALL_PART_LEN + 1 ] = 0x00;
   /*sprintf( stderr, "小數部分格式化後:%s", ( char * )szNum );*/
   
   /* ---- 整數部分格式化 ----*/    
   /* ------ 去掉小寫金額前面可能存在的多餘的零 ------ */
   i = 0;   
   while( szNum[ i ] == '0')
   {
      if( i < strlen( szNum ) && szNum[ i + 1 ] != '.')
      {
         szNum++;
      }else
      {
         i++;
      }	
   }   
   /* -- 格式換完畢 --*/
                    
   /* -- 輸入長度驗證 -- */
   /*
   if( point_pos + SMALL_PART_LEN + 1 < strlen( szNum ) ) 
   {  	
      sprintf( CapsBuf, "小數部分長度超過:%d", SMALL_PART_LEN );
      return( CapsBuf );     
   } 
   */
   if( point_pos + SMALL_PART_LEN + 1 > MAX_SMALL_AMOUNT_LEN ) 
   {  	
      sprintf( CapsBuf, "整數部分長度超過:%d", MAX_SMALL_AMOUNT_LEN - SMALL_PART_LEN - 1 );
      return( CapsBuf );
   } 
   
   if( szNum[0]=='.' )
   {
      buf[0] = '0';	   	
   }            
   strcat( buf, szNum );
          
   /************ 執行轉換 *******************/ 
   /* -- 循環處理 -- */
   point_pos = strlen( buf ) - SMALL_PART_LEN - 1;   
   i = 1;
   while( buf[ point_pos + i ] == '0' )
   {
      i++;
   }
   if( i > SMALL_PART_LEN  )
   {
      is_small_zero = 1;
   }
   
   position = 0;            
   index = 0;   
   while( index < strlen( buf ) )
   {
      /* 數值位轉換階段 */
      switch( buf[ index ] )
      {
         case '0':
            sprintf( big, "零" ); 
            f_power = 1;
            f_big = 1; 
            
            /*  解決何時顯示 "零" */
            if(( index + 1 ) < strlen( buf ))
            {
               if( buf[ index + 1 ] != '0' )
               {
                  f_big = 0;
               }     	  	
            }      	           	                      
            break;
         case '1':
            sprintf( big, "壹" );
            break;
         case '2':
            sprintf( big, "貳" );
            break;
         case '3':
            sprintf( big, "叄" );
            break;
         case '4':
            sprintf( big, "肆" );
            break;
         case '5':
            sprintf( big, "伍" );
            break;
         case '6':
            sprintf( big, "陸" );
            break;
         case '7':
            sprintf( big, "柒" );
            break;
         case '8':
            sprintf( big, "捌" );
            break;
         case '9':
            sprintf( big, "玖" );
            break;
         default:
            f_power = 1;
            f_big = 1; 
            break;
      }        	
            
      /* 權位轉換階段 */          
      switch( point_pos - index )
      {         										         
         case 13:
         case 5:
            sprintf( power, "萬" );        	      
            f_power = 0;
            if( buf[ index ] == '0' )
            {
            	f_big = 1;
            }
            if( point_pos > 8 && point_pos - index == 5)
            {
               if( buf[ point_pos - 5 ] == '0' && buf[ point_pos - 6 ] == '0' 
                         && buf[ point_pos - 7 ] == '0' && buf[ point_pos - 8 ] == '0')
               {
                  f_power = 1;
               }
            }
            break;   
         case 16:
         case 12:
         case 8:
         case 4:
            sprintf( power, "仟" );
            break;
         case 15:
         case 11:
         case 7:
         case 3:
            sprintf( power, "佰" );
            break;
         case 14:
         case 10:
         case 6:
         case 2:
            sprintf( power, "拾" );
            break;
         case 9:
            sprintf( power, "億" );
            f_power = 0;
            if( buf[ index ] == '0' )
            {
               f_big = 1;
            }
            break;
         case 1:
            sprintf( power, "元" );
            if( buf[ index ] == '0' )
            {
            	f_big = 1;
            }
            
            /* 解決何時不顯示"元" */
            if( position == 0 && f_big == 1 && !is_small_zero )
            {
               f_power = 1;
            }
            else
            {
               f_power = 0;
            }
            
            /* 解決何時顯示"0" */
            if( position == 0 && f_big == 1 && is_small_zero )
            {
               f_big = 0;
            }                     	         	       	  
            break;
         case 0:
            sprintf( power, "整" );
            f_power = 1;
            if( is_small_zero )
            {
               f_power = 0;
            }  
            break;
         case -1:
            sprintf( power, "角" );
            /* 解決何時不顯示"0" */
            if( position == 0 && buf[ index ] == '0')
            {
               f_big = 1;
            }
            break;
         case -2:
            sprintf( power, "分" );
            break;
      	 default:
            f_power = 1;
            break;
      } 

      if(!f_big)
      {
         str[ position++ ] = big[ 0 ];
         str[ position++ ] = big[ 1 ];
      }
      if(!f_power)
      {          
         str[ position++ ] = power[ 0 ];
         str[ position++ ] = power[ 1 ];     
      }
      f_big = 0;
      f_power = 0; 
      index++;                    
   } 
   /* 循環處理完畢 */

   str[ position ] = 0x00;
   strcat( CapsBuf, str );
   return( CapsBuf );
}

int main()
{
   char ch[ 50 ];
   fprintf( stderr, "請輸入小寫金額: " );
   fflush( stdin );
   gets( ch );
   fflush( stdin );
   fprintf( stderr, "轉換後大寫金額: [%s]\n", ( char * )amount_switch_small_to_big( ch ));
   return( 0 );
}
相關文章
相關標籤/搜索