Extensive number for number

10

I would like to convert an extended number to normal int; example:

FunçãoParaConverter("trinta e dois")                        // retorna 32
FunçãoParaConverter("mil vinte e quatro")                   // retorna 1024
FunçãoParaConverter("mil trezentos e trinta e tres")        // retorna 1333
FunçãoParaConverter("sete mil setecentos e setenta e sete") // retorna 7777
    
asked by anonymous 15.12.2017 / 20:16

1 answer

3

Based on the examples listed in the question comments, I created the routine below to convert the extended number to int .

In short, the routine works as follows: it breaks the text in words and searches the dictionaries ( NumDict and MilharDict ) the value that will be counted for each word.

It is working fine but can be improved. For example, a text syntax check could be implemented to generate an error when the text was spelled wrong (eg thirty-ten)

An example of the code running online at link (by @VirgilioNovic)

Dictionary<string,int> NumDict;
Dictionary<string,int> MilharDict;

private int ExtensoToInteiro(string extenso)
{           

    if (NumDict == null)
    {
        NumDict = new Dictionary<string,int>();
        MilharDict = new Dictionary<string,int>();

        NumDict.Add("zero",0);
        NumDict.Add("um",1);
        NumDict.Add("dois",2);
        NumDict.Add("três",3);
        NumDict.Add("quatro",4);
        NumDict.Add("cinco",5);
        NumDict.Add("seis",6);
        NumDict.Add("sete",7);
        NumDict.Add("oito",8);
        NumDict.Add("nove",9);

        NumDict.Add("dez",10);
        NumDict.Add("onze",11);
        NumDict.Add("doze",12);
        NumDict.Add("treze",13);
        NumDict.Add("quatorze",14);
        NumDict.Add("quinze",15);
        NumDict.Add("dezesseis",16);
        NumDict.Add("dezessete",17);
        NumDict.Add("dezoito",18);
        NumDict.Add("dezenove",19);

        NumDict.Add("vinte",20);
        NumDict.Add("trinta",30);
        NumDict.Add("quarenta",40);
        NumDict.Add("cinquenta",50);
        NumDict.Add("sessenta",60);
        NumDict.Add("setenta",70);
        NumDict.Add("oitenta",80);
        NumDict.Add("noventa",90);

        NumDict.Add("cem",100);
        NumDict.Add("cento",100); 
        NumDict.Add("duzentos",200);
        NumDict.Add("trezentos",300);
        NumDict.Add("quatrocentos",400);
        NumDict.Add("quinhentos",500);
        NumDict.Add("seiscentos",600);
        NumDict.Add("setecentos",700);
        NumDict.Add("oitocentos",800);
        NumDict.Add("novecentos",900);

        MilharDict.Add("mil",1000);
        MilharDict.Add("milhão",1000000);
        MilharDict.Add("milhões",1000000);
        MilharDict.Add("bilhão",1000000000);
        MilharDict.Add("bilhões",1000000000);
    }

    int resultado = 0;
    int grupoCorrente = 0;

    foreach (var word in extenso.Split(' '))
    {
        if (NumDict.ContainsKey(word))
        {
            grupoCorrente += NumDict[word];
        }
        else if (MilharDict.ContainsKey(word))
        {
            resultado += (grupoCorrente == 0 ? 1 : grupoCorrente) * MilharDict[word];
            grupoCorrente = 0;
        }               
    }

    resultado += grupoCorrente;

    return resultado;
}
    
16.12.2017 / 01:00