Corrigindo os decimais no ASP.NET MVC (Tutorial + código)

Olá a todos! estou de volta, peço desculpas pelo enorme hiato. Como quase sempre programação é, na maior parte do tempo, solucionar problemas, então vamos a mais um.:

O Separador decimal

O separador dos valores decimais não seguem o mesmo padrão para o mundo todo (veja no artigo da Wiki: http://pt.wikipedia.org/wiki/Separador_decimal), ou seja em algumas partes do mundo se utiliza (".") ponto e em outros lugares (",") vírgula.

Beco sem saída

O Jquery Validate considera apenas o (".") ponto para decimais, não validando valores com (",") vírgula.


Até aí tudo bem... mas o grande problema vem agora, o ASP.NET na versão para o pt-br, faz o bind do valor decimal considerando o formato utilizado no Brasil que é a (",") vírgula concatenado os valores após o ponto, ou seja o valor 33.2 vira 332.


E aí dá pra resolver?

Claro que sim! se o ASP.NET MVC não está entendendo corretamente os valores decimais então vamos "ensiná-lo". Para isso vamos criar um Binder customizado para tratar os valores decimais enviados do formulário para o controller. Para criar um binder é muito simples crie uma classe que implementa a interface IModelBinder com isso será implementado o método BindModel, é nesse método que será feita a lógica para a correta conversão do valor.

Em 1ª lugar você deve obter o valor que foi submetido, conforme exemplo abaixo:


Feito isso vamos tratar o valor:


Então o que eu fiz no código acima? simples na 1ª condição é verificado, utilizando um regex, se o valor veio com (".") ponto, caso sim ele converte para decimal utilizado CultureInfo.InvariantCulture que considera valores com ponto.

Na 2ª condição é verificado se o valor veio com (",") vírgula aí utiliza CultureInfo.CurrentCulture que no nosso caso converte os valores considerando a (",") vírgula.

A 3ª condição é para os casos que sejam entrados valores inteiros.

Por fim precisamos "registrar" o nosso Binder, no arquivo Global.asax, especificando que o mesmo irá tratar valores decimais:



E agora é só correr pro abraço!

Quer o código? ele tá disponível aqui: https://github.com/rafaelguinho/decimalbinder

5 comentários:

  1. Trabalhar com casas Decimais hoje em dia é imprescindível, muito bom, creio que muitas pessoas como eu, precisou contornar de alguma forma esse tipo de problema, e está ai uma forma que podemos deixar fixa no projeto. #BomDemais

    ResponderExcluir
  2. Você fez um Binder customizado para tratar os valores decimais enviados do formulário para o controller, e como faço um Binder para tratar do controller para o formulário?

    ResponderExcluir
  3. Duvida.. no caso do lado do asp net mvc porque não usar ? pra mim resolveu.. a parte que ta me chateando eh fazer o jquery aceitar a virgula

    ResponderExcluir
  4. Não saiu o trecho de codigo.. antes do "?" tem esse trecho aqui que vai no web.config globalization culture="pt-BR" uiCulture="pt-BR"

    ResponderExcluir