How to convert numbers to Arabic words in x++?

some customers need amount in invoices and checks with Arabic words
system convert amount to English words as a default,
but if you need to covert in Arabic , you must make some customization.
we will use the same logic in English words.

just go to AOT/classes/Global

you will find a method called numeralsToTxt

just create anther method for Arabic numbers with SAR currency as the following

static TempStr numeralsToTxt_AR(real _num)
{
    real    numOfPennies = decround(frac(_num), 2);
    real    test         = _num - frac(_num);
    str     zero;
    str     comma;
    str     and;
    str     cent;
    int     numOfTenths;
    str 20  ones[19], tenths[9], hundreds, thousands, millions, billions, trillions;

    int64   temp;
    str 200  returntxt;

    real modOperator(real a1, real a2)
    {
    int     tmpi;
    real    tmp1, tmp2;
    tmp1 = a1 / a2;
    tmpi = real2int(tmp1);
    tmp2 = tmpi;
    return (tmp1 - tmp2)*a2;
    }

    str doubleDigit2ARTxt(real doubledigit,boolean _pennies = false)
    {
        str     txt;
        int     firstDigit;
        real    tempdigit;

        if(_pennies)
        {
            firstDigit = doubledigit * 10;
            doubledigit = doubledigit * 100;
            if(!firstDigit)
            {
                doubledigit = doubledigit mod 10;
                //txt = zero + " " + ones[doubledigit];
                txt = ones[doubledigit];
                return txt;
            }
        }
        tempdigit = doubledigit;
        if (tempdigit >= 20)
        {
            tempdigit = tempdigit div 10;
            txt = tenths[tempdigit];
            doubledigit = doubledigit mod 10;
        }
        if (doubledigit >= 1)
        {
            txt = txt ?  (ones[doubledigit] + and + txt) : ones[doubledigit];
        }

        return txt;
    }

    real checkPower(real  _test,int64 _power)
    {
        int64   numOfPower;

        if (_test >= _power)
        {
            numOfPower = _test div _power;
            if (numOfPower >= 100)
            {
                temp = numOfPower div 100;

                if(temp > 9)// The validation was previously on 2
                {
                    returntxt = returntxt ? (returntxt + and + ones[temp] + ' ' + hundreds) :(returntxt + ' ' + ones[temp] + ' ' + hundreds);
                }

                else
                {
                    switch(temp)
                    {

                        Case 1:
                                returntxt = returntxt ? (returntxt + and + hundreds) : (returntxt + ' ' + hundreds);
                                break;
                        Case 2:
                                // TO DO need to insert a label for two hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "مائتين") :   returntxt + ' ' + "مائتين";
                                break;
                        Case 3:
                                // TO DO need to insert a label for three hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "ثلاثمائة") :   returntxt + ' ' + 'ثلاثمائة';
                                break;
                        Case 4:
                                // TO DO need to insert a label for four hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "اربعمائة") :   returntxt + ' ' + "اربعمائة";
                                break;
                        Case 5:
                                // TO DO need to insert a label for five hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "خمسمائة") :   returntxt + ' ' + "خمسمائة";
                                break;
                        Case 6:
                                // TO DO need to insert a label for six hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "ستمائة") :   returntxt + ' ' + "ستمائة";
                                break;
                        Case 7:
                                // TO DO need to insert a label for seven hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "سبعمائة") :   returntxt + ' ' + "سبعمائة";
                                break;
                        Case 8:
                                // TO DO need to insert a label for eight hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "ثمانمائة") :   returntxt + ' ' + "ثمانمائة";
                                break;
                        Case 9:
                                // TO DO need to insert a label for nine hundred in Arabic
                                returntxt = returntxt ? (returntxt + and + "تسعمائة") :   returntxt + ' ' + "تسعمائة";
                                break;

                    }
                }
                numOfPower = numOfPower mod 100;
            }
            if(numOfPower > 2 && _power > 100)
            {
                returntxt = returntxt ?  (returntxt + and + doubleDigit2ARTxt(real2int(numOfPower))) : (returntxt  + ' ' + doubleDigit2ARTxt(real2int(numOfPower)));
            }
            else
            {
                if(returntxt && numOfPower)
                {
                    returntxt = returntxt + and + ' ';
                }
            }
            switch(_power)
            {
                case 1000000000000 :
                {
                    if( numOfPower == 2)
                    {
                        // TO DO need to insert a label for two trillions in Arabic
                        returntxt = returntxt + "تريليونين ";
                    }
                    else
                    {
                        returntxt = numOfPower > 10 ||  numOfPower == 1 || numOfPower == 0 ? (returntxt + ' ' + trillions) : (returntxt + ' ' + "تريليونات");
                    }
                    _test = modOperator(_test, 1000000000000.00);
                    break;
                }
                case 1000000000 :
                {
                    if( numOfPower == 2)
                    {
                        // TO DO need to insert a label for two billions in Arabic
                        returntxt = returntxt + "مليارين";
                    }
                    else
                    {
                        returntxt = numOfPower > 10 ||  numOfPower == 1 || numOfPower == 0 ? (returntxt + ' ' + billions) : (returntxt + ' ' + "مليارات");
                    }
                    _test = modOperator(_test, 1000000000);
                    break;
                }
                case 1000000 :
                {
                    if( numOfPower == 2)
                    {
                        // TO DO need to insert a label for two Millions in Arabic
                        returntxt = returntxt + "مليونين";
                    }
                    else
                    {

                        returntxt = numOfPower > 10 || numOfPower == 1 || numOfPower == 0 ? (returntxt + ' ' + millions) : (returntxt + ' ' + "ملايين");

                    }
                    _test = modOperator(_test, 1000000);
                    break;
                }
                case 1000 :
                {
                    if( numOfPower == 2)
                    {
                        // TO DO need to insert a label for two Thousands' in Arabic
                        returntxt = returntxt + "ألفين";
                    }
                    else
                    {
                        returntxt = numOfPower > 10 ||  numOfPower == 1 || numOfPower == 0  ? (returntxt + ' ' + thousands) : (returntxt + ' ' + "الاف");
                    }
                    _test = modOperator(_test, 1000);
                    break;
                }
                case 100 :
                {
                    switch (numOfPower)
                    {
                        case 2:
                        returntxt = returntxt + "مائتين";
                        break;

                        case 3:
                        returntxt = returntxt +"ثلاثمائة";
                        break;

                        case 4:
                        returntxt = returntxt + "اربعمائة";
                        break;

                        case 5:
                        returntxt = returntxt + "خمسمائة";
                        break;

                        case 6:
                        returntxt = returntxt + "ستمائة";
                        break;

                        case 7:
                        returntxt = returntxt + "سبعمائة";
                        break;

                        case 8:
                        returntxt = returntxt + "ثمانمائة";
                        break;

                        case 9:
                        returntxt = returntxt + "تسعمائة";
                        break;

                        default:
                        returntxt = returntxt + ' ' + hundreds;
                    }

                     _test = modOperator(_test, 100);
                    break;
                }
            }

        }
        return _test;

    }

    infolog.language("AR");

    and     = ' ' + "@SYS5534" + ' ';
    comma   = "ريـال";
    //comma = "@SYS80142";
    zero    = "@SYS2068";
    cent    = "هللــه";

    ones[1] = "@SYS26620";
    ones[2] = "@SYS26621";
    ones[3] = "@SYS26622";
    ones[4] = "@SYS26626";
    ones[5] = "@SYS26627";
    ones[6] = "@SYS26628";
    ones[7] = "@SYS26629";
    ones[8] = "@SYS26630";
    ones[9] = "@SYS26631";
    ones[10] = "@SYS26632";
    ones[11] = "@SYS26633";
    ones[12] = "@SYS26634";
    ones[13] = "@SYS26635";
    ones[14] = "@SYS26636";
    ones[15] = "@SYS26637";
    ones[16] = "@SYS26638";
    ones[17] = "@SYS26639";
    ones[18] = "@SYS26640";
    ones[19] = "@SYS26641";

    tenths[1] = 'Not used';
    tenths[2] = "@SYS26643";
    tenths[3] = "@SYS26644";
    tenths[4] = "@SYS26645";
    tenths[5] = "@SYS26646";
    tenths[6] = "@SYS26647";
    tenths[7] = "@SYS26648";
    tenths[8] = "@SYS26649";
    tenths[9] = "@SYS26650";

    hundreds    = "@SYS26651";
    thousands   = "@SYS26652";
    millions    = "@SYS26653";
    billions    = "@SYS26654";
    trillions   = "@SYS101697";

    if(test == 0)
    {
        returntxt = zero;
    }
    else
    {
        test = checkPower(test, 1000000000000);
        test = checkPower(test, 1000000000);
        test = checkPower(test, 1000000);
        test = checkPower(test, 1000);
        test = checkPower(test, 100);
    }

    if(returntxt && test)
    {
        returntxt = returntxt + and + doubleDigit2ARTxt(real2int(test));
    }
    else
    {
        returntxt = returntxt + ' ' + doubleDigit2ARTxt(real2int(test));
    }

    if(numOfPennies)
    {
        //Removing the stars and addin the pound and cent wording to fullfil the Egyptian requierment
        returntxt = ' فقط ' + returntxt + ' ' + comma + ' ' + and + doubleDigit2ARTxt(numOfPennies,true) + ' ' + cent + ' لاغير ';
        //returntxt = '***' + returntxt + ' ' + comma + ' ' + doubleDigit2ARTxt(numOfPennies,true);

    }
    else
    {
        //Removing the stars and the zeros if no cents to fullfil the Egyptian requierment
        returntxt = ' فقط ' + returntxt + ' ' + comma + ' لاغير ';

        //returntxt = '***' + returntxt + ' ' + comma + ' ' + zero + ' ' + zero;
    }



    return returntxt;
}

after that you can call this method ant any place in dynamics AX.





Comments

Post a Comment