數字金額轉換成漢字大寫的金額c語言實現

  用發帖子,找個分類竟然找不到合適的,就看到 遊戲/數碼 網際網路最接近這方面:

數字金額轉換成漢字大寫的金額,給大家分享一下

char* MoneyToChinaHanZi(double money, char* chinaHZ)

將數字金額轉換為漢字大寫的金額。理論上支持任意位數的金額(只要計算機能支持足夠 長的數字位數)。

實際支持的位數由函數內部char mony[1024]變量的長度確定,還與計算機數據類型能表示的最大長度有關。

參數  money 輸入數字金額. money的值不小於0.

chinaHZ 輸出參數,輸出轉換後的漢字大寫金額。

返回值:   失敗返回NULL,金額小於0; 

成功返迴轉換後的大寫金額字符串。

方法/步驟

/** \brief MoneyToChinaHanZi()將數字金額轉換為漢字大寫的金額。理論上支持任意位數的金額(只要計算機能支持足夠長的數字位數)。

*        實際支持的位數由char mony[1024]變量的長度確定,還與計算機數據類型能表示的最大長度有關。

* \param    money 輸入數字金額. money的值不小於0.

* \param    chinaHZ 輸出參數,輸出轉換後的漢字大寫金額。

* \return   失敗返回NULL,金額小於0; 

*           成功返迴轉換後的大寫金額字符串;

*/

char* MoneyToChinaHanZi(double money, char* chinaHZ)

{

char* cpaiHZnum[] = {"零","壹","貳", "叄","肆","伍","陸","柒","捌","玖"};

char* unitL[] = {"拾","佰","仟","萬","拾","佰","仟","億"};

char* yuan[]={"元"};

char* unitR[] = {"角","分"};

char mony[1024];

memset(mony, 0x00, sizeof(mony));

sprintf(mony, "%.2lf", money);

if(mony[0]=='-')

{

printf("error,金額不能小於0\n");

return NULL;

}

int i=0;

int dotIndex=0; //記錄小數點位置索引

int slen=strlen(mony);

//獲取小數點位置索引

for(i=0; i<slen; i++)

{

if(mony[i]=='.')

{

dotIndex=i;

break;

}

}

//處理小數點左邊

strcpy(chinaHZ, "\0");//防止chinHZ內有髒數據時連接多餘數據

//處理第一個字符的值

i=0;

strcat(chinaHZ,cpaiHZnum[mony[i]-0x30]);

if(dotIndex-i-2>=0)

{

strcat(chinaHZ,unitL[(dotIndex-i-2)%8]);

}

else

{

//strcat(chinaHZ,yuan[0]);

}

//從第二個字符開始處理

for(i=0+1; i<dotIndex; i++)

{

int tt=0;

if( mony[i]=='0')

{

tt=dotIndex-2 - i;

if(tt%8==7 )

{

strcat(chinaHZ,unitL[7]);//單位:億

}

//單位萬的位置及其左邊三位數字全部是0,則數字金額中不加單位萬

if(tt%8==3 && mony[i]=='0' && mony[i-1]=='0' && mony[i-2]=='0' && mony[i-3]=='0')

{

continue;

}

if(tt%8==3 )

{

strcat(chinaHZ,unitL[3]);//單位:萬

}

continue;

}

if(mony[i-1]=='0' && mony[i] !='0')

{

strcat(chinaHZ, cpaiHZnum[0]);

strcat(chinaHZ, cpaiHZnum[mony[i]-0x30]);

if(dotIndex-i==1)//個位,連接單位元

{

// strcat(chinaHZ, yuan[0]);

}

else if(dotIndex-i>1)

{

strcat(chinaHZ, unitL[(dotIndex-i-2)%8]);

}

}

if(mony[i-1]!='0' && mony[i] != '0')

{

strcat(chinaHZ, cpaiHZnum[mony[i]-0x30]);

if(dotIndex-i==1)//個位,連接單位元

{

//strcat(chinaHZ, yuan[0]);

}

else if(dotIndex-i>1)//不是個位,連接相應的單位

{

strcat(chinaHZ, unitL[(dotIndex-i-2)%8]);

}

}

}

strcat(chinaHZ, yuan[0]);//不管多少位,整數部分最後都要連接單位:元

//小數點後兩位不全為0, 則處理小數點後的

if(!(mony[dotIndex+1]=='0' && mony[dotIndex+2]=='0'))

{

//連接點和小數點後兩位

for(i=dotIndex+1; i<=dotIndex+2; i++)

{

if((i==dotIndex+2) && mony[i]=='0')

{

//小數點後面第二位為0時,不做任何處理,如 0.70元轉為 柒角

continue;

}

strcat(chinaHZ, cpaiHZnum[mony[i]-0x30]);

if(mony[i]!='0')//如果小點後不為0則加單位

{

strcat(chinaHZ, unitR[(i-dotIndex-1)]);

}

}

}

chinaHZ[strlen(chinaHZ)]='\0';

return chinaHZ;

}

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場