Converting numbers into text in scripts

Sometimes for better user experience, you might need to convert numbers into text. The most typical case is writing a number: 152 – one hundred and fifty-two.

You can do it with the following script:

public void OnSummaChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
{
    decimal mon;//there is no decimal data type in ELMA, but the RurPhrase works only with that data type, so you have to declare a decimal type variable
    mon = (decimal)context.Sum.Value;//to the created variable you add the value of the Sum variable with conersion to decimal
    context.Propisjyu = P_SummaPropisjyu_Scripts.RurPhrase(mon);//with the RurPhrase method you obtain the result and write it to the Write variable.
}
                             
public static string RurPhrase (decimal money)
{ 
    return CurPhrase(money,"euro");
}
 
public static string NumPhrase (ulong Value, bool IsMale) 
{
    if (Value==0UL) return "Zero";
    string[] Dek1={"","one","two"," three"," " four"," five"," six"," seven"," eight"," nine"," ten"," eleven"," twelve"," thirteen",
    " fourteen"," fifteen"," sixteen"," seventeen"," eighteen"," nineteen"};
    string[] Dek2={"",""," twenty"," thirty"," fourty"," fifty"," sixty"," seventy"," eighty"," ninety"};
    string[] Dek3={""," one hundred"," two hundred"," three hundred"," four hundred"," five hundred"," six hundred"," seven hundred"," eight hundred"," nine hundred"};
    string[] Th={"",""," thousand"," million"," billion"," trillion"," quadrillion"," quintillion"};
    string str="";
    for (byte th=1; Value>0; th++) 
    {
        ushort gr=(ushort)(Value%1000); 
        Value=(Value-gr)/1000;
        if (gr>0) 
        {
            byte d3=(byte)((gr-gr%100)/100);
            byte d1=(byte)(gr%10);
            byte d2=(byte)((gr-d3*100-d1)/10);
            if (d2==1) d1+=(byte)10;
            bool ismale=(th>2)||((th==1)&&IsMale);
            str=Dek3[d3]+Dek2[d2]+Dek1[d1]+EndDek1(d1,ismale)+Th[th]+EndTh(th,d1)+str;
        };
    };
    str=str.Substring(1,1).ToUpper()+str.Substring(2);
    return str;
}
 
#region Private members
 
private static string CurPhrase (decimal money, 
    string word1,string word234,string wordmore,
    string sword1,string sword234,string swordmore)
{ 
    money=decimal.Round(money,2);
    decimal decintpart=decimal.Truncate(money);
    ulong intpart=decimal.ToUInt64(decintpart);
    string str=NumPhrase(intpart,true)+" ";
    byte endpart=(byte)(intpart%100UL); 
    if (endpart>19) endpart=(byte)(endpart%10);
    switch (endpart) 
    {
        case 1: str+=word1; break;
        case 2:
        case 3:
        case 4: str+=word234; break;
        default: str+=wordmore; break;
    }
    byte fracpart=decimal.ToByte((money-decintpart)*100M);
    str+=" "+((fracpart<10)?"0":"")+fracpart.ToString()+" ";
    if (fracpart>19) fracpart=(byte)(fracpart%10);
    switch (fracpart) 
    {
        case 1: str+=sword1; break;
        case 2:
        case 3:
        case 4: str+=sword234; break;
        default: str+=swordmore; break;
    };
    return str;
}

#endregion

If this script is used, 1552 will be written as One thousand five hundred fifty two euro.

You can also create a method for converting between different currencies:
 
public static string USDPhrase (decimal money)
//where string is the type of data returned by the USDPhrase method, and decimal the document type of argument, money is the name of the argument
{return CurPhrase(money,"dollar";}
 
public static string GRVPhrase (decimal money)
{return CurPhrase(money,"rouble";}