這個是很早以前用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 ); }