top of page
  • Foto do escritorGuilherme Moreira

Conversor de Texto para Número

Atualizado: 19 de ago. de 2018

Nesta matéria explicarei como converter números escritos por extenso em números inteiros em alta performance.


Quando o assunto é processamento de textos muitos se deparam com um grande problema, o desempenho. Afinal, trabalhar com manipulação de Strings em qualquer linguagem de programação, de fato, exigirá mais do processador. Converter um número por extenso para um número inteiro pode parecer inviável por que no primeiro instante imagina-se que precisará escrever uma quantidade extensa de códigos utilizando sintaxes de manipulação de Strings, expressões condicionais, métodos, conversores, e outros recursos para obter um resultado satisfatório. Ao levar em consideração a performance quando aplicado em uma grande quantidade de informações logo provavelmente poderá concluir que tal ideia é inviável. Mas não se preocupe! O objetivo desta matéria é justamente resolver este problema.


Imagine o seguinte cenário:


Você tem uma lista com milhões de linhas de texto, e em cada linha você precisa converter todas as ocorrências de números escritos por extenso para números inteiros sem perder velocidade de processamento.


Suponha que em alguma destas linhas teremos a seguinte frase:


"João pediu duzentos e trinta e um grãos de arroz para Mateus mas Mateus só tinha cento e doze grãos. Para resolver este problema Mateus foi até a casa de Lucas que tinha dois trilhões, oitocentos e um bilhões, seiscentos e noventa milhões, quinhentos e vinte e cinco mil e cento e catorze em grãos de arroz para pedir emprestado a diferença para dar a João."


E você precisa converter essa frase para: "João pediu 231 grãos de arroz para Mateus mas Mateus só tinha 112 grãos. Para resolver este problema Mateus foi até a casa de Lucas que tinha 2.801.690.525.114 em grãos de arroz para pedir emprestado a diferença para dar a João."


Primeiro precisaremos criar um dicionário:

E adicionar o seguinte conteúdo:

Repare que para cada número há uma lista de sinônimos/palavras que irá reconhecer o número inteiro correspondente a ele. Podemos posteriormente acrescentar palavras comumente escrita erradas para que nada seja perdido durante a conversão.


O tipo definido utilizado para o número inteiro é Long sem Sinal (-) para que o conversor possa identificar o maior valor possível suportado, ou seja, até quintilhão.


Algoritmo de conversão:

Este é um algoritmo simples, super rápido e eficaz. Basicamente ele faz a soma da centena com a dezena com a unidade e o resultado ele multiplica com o milhar, sequencialmente da esquerda para a direita.


Contador de zeros a direita:

Este é um cálculo simples e super rápido que descobre a quantidade de zeros a direita de um número para evitar o uso dos desastrosos Convert e Substring que poderiam causar um impacto negativo na performance.

 

Extensão para remoção de diacríticos (acentuação):

Também considerado muito rápido, esta solução converterá todas as palavras acentuadas em palavras não acentuadas.


Conversor de Texto para Número:

Higienizamos o texto removendo todos os diacríticos e convertendo-o para minúsculo. Dividimos o texto em uma Array de palavras e percorremos todos os elementos da primeira até a última palavra comparando cada uma com os valores do dicionário para descobrir qual número (key) ele pertence e ao mesmo tempo fazendo a coleta sequencial desses números para enviá-los ao Algoritmo de Conversão no final de cada sequencia numérica, obtendo assim o resultado e realizando as devidas substituições durante o percurso. Sem longas delongas o método retorna o texto fazendo a junção da Array para String já convertido!


Desta forma obtemos um dos maiores desempenhos em conversão de Texto para Número, ou Número  Extenso para Números Inteiros.


Testes de Desempenho


Utilizando Linq:

Utilizando PLinq:

Em Breve publicarei uma nova matéria sobre esta solução rodando direto na placa de vídeo (GPGPU) acelerando em mais de 1000% o poder de processamento.


330 visualizações0 comentário
bottom of page