Número em extenso para número – c# string inteiros

Pergunta:


Gostaria de transformar um numero extenso para int normal; exemplo:

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

Autor da pergunta Mr Mago

Fernando

Com base nos exemplos listados nos comentários da pergunta, eu criei a rotina abaixo para converter o número por extenso em int.

Resumidamente, a rotina funciona da seguinte forma: ela quebra o texto por extenso em palavras e busca nos dicionários (NumDict e MilharDict) o valor que será contabilizado para cada palavra.

Ela está funcionando direitinho mas pode ser melhorada. Por exemplo: poderia ser implementada uma verificação de sintaxe do texto para gerar um erro quando o texto estivesse escrito errado (ex: trinta e dez)

Um exemplo do código rodando online em https://ideone.com/vWGJYQ (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;
}

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *