سلام :)
در این توپیک قصد دارم این موضوع را برای انواع کامپایلرهای C و ++C پیاده سازی کنم، چون به نظرم علاوه بر جنبه آموزشی میتواند در بسیاری از برنامه ها کاربردی باشد.
خوب اولین کد مربوط میشه به محیط های توسعه دهنده ANSI C، شما قادر خواهید بود از این کد در تمام کامپایلر های C استفاده کنید. از آنجایی که اغلب افراد برای محیط MS DOS از TC++ 2.0 یا TC++ 3.1 استفاده میکنند بنابراین این کد به آنها تعلق دارد :)
موفق و پیروز باشید.
/************************************************** **********************
* *
* $Author: Hadi Rezaee m_hadi_rezaee@hotmail.com *
* $Company: Galaxy Road http://www.GalaxyRoad.com *
* $Description: Number to string ! *
* $Date: 3/8/2004 *
* $Version: 1.0 *
* $NOTICE: You're FREE to use or change the code in your *
* programs, This code has full compatibility with *
* ANSI C compilers. *
* It has been tested with TC++ 3.1 and VC++ 7.1 *
* successfully. *
* *
************************************************** **********************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef enum bool { true = 1, false = 0 };
const char ch1[9][10] = { "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه", };
const char ch2[10][10] = { "ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده", };
const char ch3[8][10] = { "بیست", "سی", "چهل", "پنجاه", "شصت", "هفتاد", "هشتاد", "نود", };
const char ch4[9][10] = { "صد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد", };
const char ch5[3][10] = { "هزار", "میلیون", "میلیارد", };
void AddPreString( char *string, const char *pre )
{
char *szTemp = new char[ strlen( string ) + strlen( pre ) ];
strcpy( szTemp, pre );
strcat( szTemp, string );
strcpy( string, szTemp );
}
void AppendAnd( char* szStr, bool bAnd )
{
if( bAnd )
{
strcat( szStr, " و " );
}
}
char* NumToStr( int num )
{
if( num == 0 )
return "صفر";
char szNumTemp[12], *szResult = new char[256];
szResult[0] = '\0';
itoa( num, szNumTemp, 10 );
while( strlen( szNumTemp ) % 3 != 0 )
AddPreString( szNumTemp, "0" );
int nCount = (int) strlen( szNumTemp ) / 3;
int i = 0;
bool bAndFlag = false;
char v_l, v_m, v_r;
for( int n = nCount; n > 0; n-- )
{
v_l = szNumTemp[ i ] - 48;
v_m = szNumTemp[ i + 1 ] - 48;
v_r = szNumTemp[ i + 2 ] - 48;
if( v_l > 0 )
{
AppendAnd( szResult, bAndFlag );
strcat( szResult, ch4[ v_l - 1 ] );
bAndFlag = true;
}
if( v_m == 1 && v_r >= 0 )
{
AppendAnd( szResult, bAndFlag );
strcat( szResult, ch2[ v_r ] );
bAndFlag = true;
}
if( v_m > 1 )
{
AppendAnd( szResult, bAndFlag );
strcat( szResult, ch3[ v_m - 2 ] );
bAndFlag = true;
}
if( v_m != 1 && v_r > 0 )
{
AppendAnd( szResult, bAndFlag );
strcat( szResult, ch1[ v_r - 1 ] );
bAndFlag = true;
}
if( n - 1 > 0 )
{
bAndFlag = false;
sprintf( szResult, "%s %s", szResult, ch5[ n - 2 ] );
AppendAnd( szResult, bAndFlag );
bAndFlag = true;
}
i += 3;
}
return szResult;
}