PDA

View Full Version : تبدیل عدد به حروف



Anti_Evil
دوشنبه 18 اسفند 1382, 15:34 عصر
سلام :)

در این توپیک قصد دارم این موضوع را برای انواع کامپایلرهای 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;
}

Anti_Evil
پنج شنبه 21 اسفند 1382, 00:31 صبح
نسخه جدید تابع برای کامپایلرهای ++ANSI C. ( با استفاده از کتابخانه STL ):


/************************************************** **********************
* *
* $Author: Hadi Rezaee m_hadi_rezaee@hotmail.com *
* $Company: Galaxy Road http://www.GalaxyRoad.com *
* $Description: Number to string ! ( STL ver ) *
* $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 VC++ 7.1 successfully. *
* *
************************************************** **********************/

#include <string>

using namespace std;

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 AppendAnd( string &strSource, bool bAnd )
{
if( bAnd )
strSource += " و ";
}

string NumToStr( int num )
{
if( num == 0 )
return "صفر";

char szNumTemp[12];
string strNumTemp, strResult;

itoa( num, szNumTemp, 10 );
strNumTemp = szNumTemp;

while( strNumTemp.length() % 3 != 0 )
strNumTemp.insert( 0, "0" );

int nCount = (int) strNumTemp.length() / 3;

int i = 0;
bool bAndFlag = false;
byte v_l, v_m, v_r;

for( int n = nCount; n > 0; n-- )
{
v_l = strNumTemp[ i ] - 48;
v_m = strNumTemp[ i + 1 ] - 48;
v_r = strNumTemp[ i + 2 ] - 48;

if( v_l > 0 )
{
AppendAnd( strResult, bAndFlag );
strResult += ch4[ v_l - 1 ];
bAndFlag = true;
}

if( v_m == 1 && v_r >= 0 )
{
AppendAnd( strResult, bAndFlag );
strResult += ch2[ v_r ];
bAndFlag = true;
}

if( v_m > 1 )
{
AppendAnd( strResult, bAndFlag );
strResult += ch3[ v_m - 2 ];
bAndFlag = true;
}

if( v_m != 1 && v_r > 0 )
{
AppendAnd( strResult, bAndFlag );
strResult += ch1[ v_r - 1 ];
bAndFlag = true;
}

if( n - 1 > 0 )
{
bAndFlag = false;
strResult += " ";
strResult += ch5[ n - 2 ];
AppendAnd( strResult, bAndFlag );
bAndFlag = true;
}

i += 3;
}

return strResult;
}

موفق باشید !

arshia_
پنج شنبه 21 اسفند 1382, 14:12 عصر
ممنون
این کد ها رو می شه توی خیلی از برنامه ها استفاده کرد
واقعا به درد می خوره... :flower:

linux
شنبه 10 مرداد 1383, 16:42 عصر
قشنگترین الگوریتم تبدیلی بود که دیده ام
مرسی

armin390
جمعه 30 مرداد 1383, 02:09 صبح
زیبا بود

mhf1364
یک شنبه 01 شهریور 1383, 11:11 صبح
آقا دمتون گرم ، خدا خیرتون بده :heart: :flower:

MicroGalaxy
چهارشنبه 01 مهر 1383, 19:16 عصر
این برنامه تا 999 میلیلرد جواب می ده البته با C# نوشتم ولی الگوریتمش تغریبا یکیه ....



private string numToStr(ulong num,int level)
{
string [][]numstr=new string[][]
{
new string[]{"صفر","یک","دو","سه","چهار","پنج","شش","هفت","هشت","نه"},
new string[]{"ده","یازده","دوازده","سیزده","چهارده","پانزده","شانزده","هفتده","هیجده","نوزده",
"بیست","سی","چهل","پنجاه","شست","هفتاد","هشتاد","نود"},
new string[]{"","صد","دویست","سیصد","چهارصد","پانصد","ششصد","هفتصد","هشتصد","نهصد"} ,
new string[]{"هزار"},
new string[]{"میلیون"},
new string[]{"میلیارد"}
};
switch (level)
{
case 1:
if(num<10)
return numstr[0][Convert.ToInt32(num)];
else
{
if(num%100<20 && num%100>9)
{
if(num<20)
return numstr[1][Convert.ToInt32(num%10)];
else
return numToStr(num/100,3)+" و "+numstr[1][Convert.ToInt32(num%10)];
}
else
return numToStr(num/10,2)+((num%10!=0)?" و "+numstr[0][Convert.ToInt32(num%10)]:"");
}
case 2:
if(num<10)
return numstr[1][Convert.ToInt32(num%10+8)];
else
return numToStr(num/10,3)+((num%10>=2 )?" و "+numstr[1][Convert.ToInt32(num%10+8)]:"");
case 3:
if(num<10)
return numstr[2][Convert.ToInt32(num%10)];
else
return numToStr(num/10,4)+((num%10!=0)?" و ":"")+numstr[2][Convert.ToInt32(num%10)];
case 4:
if(num<1000)
return numToStr(num,1)+" "+numstr[3][0];
else
return numToStr(num/1000,5)+((Convert.ToInt32(num%1000)!=0)?" و "+numToStr(num%1000,1)+" "+numstr[3][0]:"");
case 5:
if(num<1000)
return numToStr(num,1)+" "+numstr[4][0];
else
return numToStr(num/1000,6)+((Convert.ToInt32(num%1000)!=0)?" و "+numToStr(num%1000,1)+" "+numstr[4][0]:"");
case 6:
if(num<1000)
return numToStr(num,1)+" "+numstr[5][0];
else
return "";
default:
return "";
}
}

linux
یک شنبه 05 مهر 1383, 08:19 صبح
Public Class NumberToString
Private Yekan() As String = {"صفر", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه", "ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هیجده", "نوزده"}
Private Dahgan() As String = {"", "ده", "بیست", "سی", "چهل", "پنجاه", "شست", "هفتاد", "هشتاد", "نود", ""}
Private Sadgan() As String = {"", "یکصد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نُه‌صد"}
Private h() As String = {"", " هزار", " میلیون", " میلیارد", " تریلیون", " تریلیارد"}
Const va = " و "

Private Function DtoS(ByVal lDigit As Long) As String

If lDigit = 0 Then Return Yekan(0) ' اگر عددی صفر باشد

Dim strDigit As String 'جهت ذخیره عدد ورودی به صورت استرینگ
Dim strSubDigit(5) As String ' جهت ذخیره قسمتهای 3تایی عدد
Dim sDigit As String = "" 'جهت ذخیره عدد بصورت متن فارسی
Dim n As Short

strDigit = lDigit.ToString

Do Until strDigit.Length Mod 3 = 0
strDigit = "0" & strDigit
Loop

For n = 3 To strDigit.Length Step 3
strSubDigit(n / 3 - 1) = strDigit.Substring(strDigit.Length - n, 3)
Next

For n = 5 To 0 Step -1

If Val(strSubDigit(n) <> 0) Then
Dim yek, dah, sad As Byte
Dim s As String = ""

yek = Val(strSubDigit(n).Substring(2, 1))
dah = Val(strSubDigit(n).Substring(1, 1))
sad = Val(strSubDigit(n).Substring(0, 1))

If sDigit <> "" Then
sDigit &= va
End If

If sad > 0 And (dah > 0 Or yek > 0) Then
s &= Sadgan(sad) & va
Else
s &= Sadgan(sad)
End If

If dah = 1 And yek > 0 Then
s &= Yekan(dah * 10 + yek)
End If

If dah > 1 And yek > 0 Then
s &= Dahgan(dah) & va & Yekan(yek)
End If

If dah >= 1 And yek = 0 Then
s &= Dahgan(dah)
End If

If dah = 0 And yek > 0 Then
s &= Yekan(yek)
End If

sDigit &= s & h(n)
End If
Next
Return sDigit
End Function
Public Function DigitSpelling(ByVal lDigit As Long, Optional ByVal Currency As Boolean = False)
If Currency Then
Return DtoS(lDigit) & " ریال"
Else
Return DtoS(lDigit)
End If
End Function

End Class

این هم تا 999 تریلیارد یا همون هزار میلیارد شمارش می کنه
کد ویبی

armin390
دوشنبه 12 بهمن 1383, 15:53 عصر
??????????????

hasan-d
دوشنبه 10 اسفند 1383, 10:07 صبح
سلام
من یه متغیر در matlab می خواهم ایجاد کنم که مقدار حافظ آن بیشتر از مقادیر پیش فرض باشد
البته آیا می توانم برنامه ام را در c بنویسم بعد آنرا به matlab انتقال دهم لطفا به دادم برسید
با تشکر :

sahba
جمعه 14 اسفند 1383, 17:39 عصر
ممنون واقعا! ::نوشتن::

MM_Mofidi
جمعه 14 اسفند 1383, 22:48 عصر
اعداد منفی و اعشاری؟

shetakhteh
یک شنبه 14 فروردین 1384, 01:02 صبح
ممنون به درد من تازه کار که خیلی خورد ممنون

علیرضا جاوید
یک شنبه 14 فروردین 1384, 01:48 صبح
خیلی طولانی هستش میشه خیلی کوتاهتر هم نوشت ،در حدود 10 خط مثلا!!

Pars Giga
یک شنبه 15 خرداد 1384, 09:23 صبح
:kaf: :kaf:

علیرضا جاوید
یک شنبه 15 خرداد 1384, 10:29 صبح
قابل توجه علاقه مندان به الگوریتم های پیچیده
الگوریتم بالا در حداقل خطوط و حد اکثر زیبایی


function FarNum(st: string): string;
const {999,999,999,999,999,999}
farsi : array[0..36] of string[10] = ('','یک','دو','سه','چهار','پنج','شش ','هفت','هشت','نه','ده','یازده','د وازده','سیزده','چهارده','پانز ه','شانزده','هفده','هجده','نوز ه','بیست','سی'{21},'چهل'{22},'پنچا '{23},'شصت'{24},'هفتاد'{25},'هشتاد'{ 26},'نود'{27},'صد'{28},'دویست'{29},'سی صد'{30},'چهارصد'{31},'پانصد'{32},'ش صد'{33},'هفتصد'{34},'هشتصد'{35},'نه صد'{36});
function Group(i: Integer): Integer;
begin
Result := StrToInt(Copy(st, 19 - i * 3, 3));
end;
function FarsiGroup(s: Integer): string;
begin
Result := '';
If s <> 0 Then
begin
If s div 100 <> 0 Then
Result := Farsi[s div 100 + 27];
If (s mod 100 <> 0) and (s div 100 <> 0) Then
Result := Result + ' و ';
If s mod 100 < 21 Then
Result := Result + farsi[s mod 100]
else
begin
Result := Result + farsi[(s div 10) mod 10 + 18];
If s mod 10 <> 0 Then
Result := Result + ' و ' + Farsi[s mod 10];
end;
end;
end;
begin
while Length(st) < 18 do
st := '0' + st;
Result := FarsiGroup(Group(6)) + IfThen(Group(6) <> 0, ' تیلیارد ') + IfThen((Group(5) <> 0) and (Group(6) <> 0), ' و ') +
FarsiGroup(Group(5)) + IfThen(Group(5) <> 0, ' تیلیون ' ) + IfThen((Group(4) <> 0) and (Group(5) + Group(6) <> 0), ' و ') +
FarsiGroup(Group(4)) + IfThen(Group(4) <> 0, ' میلیارد ') + IfThen((Group(3) <> 0) and (Group(4) + Group(5) + Group(6) <> 0), ' و ') +
FarsiGroup(Group(3)) + IfThen(Group(3) <> 0, ' میلیون ' ) + IfThen((Group(2) <> 0) and (Group(3) + Group(4) + Group(5) + Group(6) <> 0), ' و ') +
FarsiGroup(Group(2)) + IfThen(Group(2) <> 0, ' هزار ' ) + IfThen((Group(1) <> 0) and (Group(2) + Group(3) + Group(4) + Group(5) + Group(6) <> 0), ' و ') +
FarsiGroup(Group(1)) ;
end;

mohamad2007
سه شنبه 23 بهمن 1386, 14:14 عصر
خیلی عالی بود.:تشویق:
از همه دوستان ممنونم.

emad_67
چهارشنبه 24 بهمن 1386, 07:37 صبح
خیلی عالی بود.:تشویق:
از همه دوستان ممنونم.
عزیز یکی از کاربرد های دکمه تشکر اینه که برای تشکر تاپیک های مال چند سال پیش رو بیخودی بالا نیاری.