نمایش نتایج 1 تا 18 از 18

نام تاپیک: تبدیل عدد به حروف

  1. #1
    VIP آواتار Anti_Evil
    تاریخ عضویت
    فروردین 1382
    محل زندگی
    سرگردان در کهکشان !
    پست
    529

    تبدیل عدد به حروف

    سلام :)

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

  2. #2
    VIP آواتار Anti_Evil
    تاریخ عضویت
    فروردین 1382
    محل زندگی
    سرگردان در کهکشان !
    پست
    529
    نسخه جدید تابع برای کامپایلرهای ++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;
    }


    موفق باشید !

  3. #3
    کاربر دائمی آواتار arshia_
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    ایران-شهر فرزانگان( بروجرد )
    پست
    1,226
    ممنون
    این کد ها رو می شه توی خیلی از برنامه ها استفاده کرد
    واقعا به درد می خوره... :flower:

  4. #4
    کاربر دائمی آواتار linux
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    تهران
    پست
    2,313
    قشنگترین الگوریتم تبدیلی بود که دیده ام
    مرسی

  5. #5

  6. #6
    کاربر دائمی آواتار mhf1364
    تاریخ عضویت
    مرداد 1383
    محل زندگی
    تهران
    پست
    107
    آقا دمتون گرم ، خدا خیرتون بده :heart: :flower:

  7. #7
    این برنامه تا 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&# 41;];
    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&# 41;];
    else
    return numToStr(num/10,4)+((num%10!=0)?" و ":"")+numstr[2][Convert.ToInt3 2(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 "";
    }
    }

  8. #8
    کاربر دائمی آواتار linux
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    تهران
    پست
    2,313

    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 تریلیارد یا همون هزار میلیارد شمارش می کنه
    کد ویبی

  9. #9

  10. #10
    سلام
    من یه متغیر در matlab می خواهم ایجاد کنم که مقدار حافظ آن بیشتر از مقادیر پیش فرض باشد
    البته آیا می توانم برنامه ام را در c بنویسم بعد آنرا به matlab انتقال دهم لطفا به دادم برسید
    با تشکر :

  11. #11
    ممنون واقعا! ::نوشتن::

  12. #12
    اعداد منفی و اعشاری؟

  13. #13
    ممنون به درد من تازه کار که خیلی خورد ممنون

  14. #14
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    Iran
    پست
    63
    خیلی طولانی هستش میشه خیلی کوتاهتر هم نوشت ،در حدود 10 خط مثلا!!

  15. #15

  16. #16
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    Iran
    پست
    63
    قابل توجه علاقه مندان به الگوریتم های پیچیده
    الگوریتم بالا در حداقل خطوط و حد اکثر زیبایی

    function FarNum(st: string): string;
    const {999,999,999,999,999,999}
    farsi : array[0..36] of string[10] = ('','یک','دو','سه','چهار','پنج',' شش','هفت','هشت','نه','ده','یازده' ,'دوازده','سیزده','چهارده','پا زده','شانزده','هفده','هجده','ن زده','بیست','سی'{21},'چهل'& #123;22},'پنچاه'{23},'شصت'& #123;24},'هفتاد'{25},'هشتا د'{26},'نود'{27},'صد'&#1 23;28},'دویست'{29},'سیصد'& #123;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;

  17. #17
    کاربر تازه وارد آواتار mohamad2007
    تاریخ عضویت
    آذر 1386
    محل زندگی
    مشهد
    پست
    62
    خیلی عالی بود.
    از همه دوستان ممنونم.

  18. #18
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    خیلی عالی بود.
    از همه دوستان ممنونم.
    عزیز یکی از کاربرد های دکمه تشکر اینه که برای تشکر تاپیک های مال چند سال پیش رو بیخودی بالا نیاری.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •