JSF: converter String para BigDecimal

1,009 views
Skip to first unread message

Fabricio Lemos

unread,
Oct 6, 2010, 10:50:11 AM10/6/10
to Java CE
Oi pessoal,

No JSF, como fa�o pra converter o valor de um h:inputText para
BigDecimal utilizando a v�rgula como separador de casas decimais?

O locale do faces-config.xml parece ser ignorado.

Se eu coloco o locale no convertNumber:
<h:inputText value="#{meuAction.meuNumero}">
<f:convertNumber locale="pt"/>
</h:inputText>

ele passa a reconhecer a v�rgula como separador, mas uma String como
3,68 � convertida para o BigDecimal
3.680000000000000159872115546022541821002960205078125. Acho que ele
converte para double antes de passar para BigDecimal.

Algu�m sabe uma maneira de resolver sem que eu precise escrever meu
pr�prio converter?

[]�s
Fabr�cio Lemos

Rafael Ponte

unread,
Oct 6, 2010, 12:12:02 PM10/6/10
to jav...@googlegroups.com
Fabricio,

Tente assim:
<f:convertNumber pattern="#,##0.00"/>

ou assim,
<f:convertNumber type="number" maxFractionDigits="3" minFractionDigits="2" />

O NumberConverter (que só funciona para Double e Long) do JSF é meio que remendado, ou seja, para manter a compatibilidade com a versão 1.1 ele manteve alguns remendos, o que acaba trazendo alguns erros estranhos quando se trabalha com BigDecimal.

As duas maneiras funcionaram para mim,  porém ao adicionar a JBoss EL eu tive problemas de conversão quando utilizando BigDecimal e f:convertNumber. A solução que encontrei é através do uso do mcc:convertNumber, pois ele resolve esse probleminha existente no converter padrão do JSF.

Ah! Lembre-se de configurar o faces-config.xml com o locale default como "pt_BR".

Um abraço.

2010/10/6 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>
 Oi pessoal,

No JSF, como faço pra converter o valor de um h:inputText para BigDecimal utilizando a vírgula como separador de casas decimais?


O locale do faces-config.xml parece ser ignorado.

Se eu coloco o locale no convertNumber:
<h:inputText value="#{meuAction.meuNumero}">
<f:convertNumber locale="pt"/>
</h:inputText>

ele passa a reconhecer a vírgula como separador, mas uma String como 3,68 é convertida para o BigDecimal 3.680000000000000159872115546022541821002960205078125. Acho que ele converte para double antes de passar para BigDecimal.

Alguém sabe uma maneira de resolver sem que eu precise escrever meu próprio converter?

[]´s
Fabrício Lemos

--
Você está recebendo esta mensagem porque se inscreveu no grupo "java.ce" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para jav...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para javace+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/javace?hl=pt-BR.




--
Rafael Ponte
http://www.rponte.com.br

cmilfont

unread,
Oct 6, 2010, 12:15:05 PM10/6/10
to jav...@googlegroups.com
"O NumberConverter (que só funciona para Double e Long) do JSF é meio que remendado"

O JSFail é um remendo!

Troll for food!

2010/10/6 Rafael Ponte <rpo...@gmail.com>

Marcel Maurício

unread,
Oct 6, 2010, 12:15:16 PM10/6/10
to jav...@googlegroups.com
Chapa,

tenta usar o javax.faces.convert.BigDecimalConverter e verifica se ocorre o mesmo problema.

Att

2010/10/6 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>
 Oi pessoal,

No JSF, como faço pra converter o valor de um h:inputText para BigDecimal utilizando a vírgula como separador de casas decimais?


O locale do faces-config.xml parece ser ignorado.

Se eu coloco o locale no convertNumber:
<h:inputText value="#{meuAction.meuNumero}">
<f:convertNumber locale="pt"/>
</h:inputText>

ele passa a reconhecer a vírgula como separador, mas uma String como 3,68 é convertida para o BigDecimal 3.680000000000000159872115546022541821002960205078125. Acho que ele converte para double antes de passar para BigDecimal.

Alguém sabe uma maneira de resolver sem que eu precise escrever meu próprio converter?

[]´s
Fabrício Lemos

--
Você está recebendo esta mensagem porque se inscreveu no grupo "java.ce" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para jav...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para javace+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/javace?hl=pt-BR.

Rafael Ponte

unread,
Oct 6, 2010, 12:18:44 PM10/6/10
to jav...@googlegroups.com
Esse sim não funciona quando se trata de valores monetários, Marcel :-)

2010/10/6 Marcel Maurício <marcel.w...@gmail.com>



--
Rafael Ponte
http://www.rponte.com.br

Rafael Ponte

unread,
Oct 6, 2010, 12:19:42 PM10/6/10
to jav...@googlegroups.com
Milfont,

Tenho que concordar contigo! Eu já me estressei muito com este bug/remendo/whatever do JSF :'-(

2010/10/6 cmilfont <cmil...@gmail.com>

Fabricio Lemos

unread,
Oct 6, 2010, 12:53:14 PM10/6/10
to jav...@googlegroups.com
Rafael, ele continua transformando para um BigDecimal de várias casas decimais.

Vi aqui que basta colocar <f:convertNumber />, sem nenhum atributo, que ele possa reconhecer a vírgula, mas ainda assim convertendo errado.

Ei Milfont, não vem querer trollar e tumultuar a thread não :)

Marcel Maurício

unread,
Oct 6, 2010, 12:58:26 PM10/6/10
to jav...@googlegroups.com
Fabricio,

sei que vc num queria ter que escrever um converter próprio pra isso, mas achei uma thread (http://www.techienuggets.com/Comments?tx=11556) que trata de JSF e BigDecimal. Não sei se ajuda mto.

Att
2010/10/6 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>
Rafael, ele continua transformando para um BigDecimal de várias casas decimais.



--

Fabricio Lemos

unread,
Oct 6, 2010, 1:01:21 PM10/6/10
to jav...@googlegroups.com
É, tinha visto essa página. Mas escrever converter pra um caso tão simples é a ultima opção.

valeu!

Rafael Ponte

unread,
Oct 6, 2010, 1:07:40 PM10/6/10
to jav...@googlegroups.com
Fabricio,

Você tentou as duas maneiras?

Aqui não tive problemas! Aqui tem um exemplo,
http://github.com/rponte/jsf-loja-project/blob/master/WebContent/pages/produto/novo.jspx#L28

Já cai noutros problemas, mas nenhum deste tipo :-)

2010/10/6 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>

Fabricio Lemos

unread,
Oct 6, 2010, 1:25:09 PM10/6/10
to jav...@googlegroups.com
Tentei das duas maneiras, mas com o f:convertNumber ao invés do mcc:convertNumber. Eu nem tenho o myfaces no meu projeto. Com o f:convertNumber também funciona contigo?

Rafael Ponte

unread,
Oct 6, 2010, 1:27:10 PM10/6/10
to jav...@googlegroups.com
Sim, funcionou sim!

Como disse, só passei a usar o mcc:convertNumber quando adicionei a JBoss EL no projeto! Talvez teu problema seja esse se você estiver utilizando o JBoss Seam.

2010/10/6 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>

Fabricio Lemos

unread,
Oct 6, 2010, 1:46:48 PM10/6/10
to jav...@googlegroups.com
Estou usando o módulo faces do Seam 3, mesmo assim retirei momentaneamente e o erro continuou. Talvez seja um bug específico do JSF 2 :(

Rafael Ponte

unread,
Oct 6, 2010, 2:00:59 PM10/6/10
to jav...@googlegroups.com
Fabricio,

Refiz os testes (exibir e submeter) aqui e as 3 maneiras que citei funcionaram corretamente aqui. Provavelmente deve existir algum problema na versão 2.0 do faces.

2010/10/6 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>

Jonathas Lima

unread,
Oct 6, 2010, 2:07:43 PM10/6/10
to jav...@googlegroups.com
<f:convertNumber type="number" locale="pt_BR"/>

Em 6 de outubro de 2010 11:50, Fabricio Lemos <fabrici...@sefaz.ce.gov.br> escreveu:
 Oi pessoal,

No JSF, como faço pra converter o valor de um h:inputText para BigDecimal utilizando a vírgula como separador de casas decimais?


O locale do faces-config.xml parece ser ignorado.

Se eu coloco o locale no convertNumber:
<h:inputText value="#{meuAction.meuNumero}">
<f:convertNumber locale="pt"/>
</h:inputText>

ele passa a reconhecer a vírgula como separador, mas uma String como 3,68 é convertida para o BigDecimal 3.680000000000000159872115546022541821002960205078125. Acho que ele converte para double antes de passar para BigDecimal.

Alguém sabe uma maneira de resolver sem que eu precise escrever meu próprio converter?

[]´s
Fabrício Lemos

--
Você está recebendo esta mensagem porque se inscreveu no grupo "java.ce" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para jav...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para javace+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/javace?hl=pt-BR.




--
Jonathas Lima
Analista de Sistemas

Fabricio Lemos

unread,
Oct 6, 2010, 2:43:10 PM10/6/10
to jav...@googlegroups.com
Mesmo erro. Aqui só para de dar o erro se tirar o f:convertNumber, mas daí para de reconhecer a vírgula.

André Paes Rodrigues

unread,
Oct 8, 2010, 9:58:11 AM10/8/10
to jav...@googlegroups.com
Cara, aqui, a solução para esse problema foi criar um Converter mesmo.
Esse number converter do JSF é todo bugado mesmo, pelo menos para BigDecimal. Só não é um fail maior do JSF pq ele é todo plugável. Então dá para "consertar" o framework...

Inclusive é possível configurar a aplicação de forma que o teu converter seja usado automaticamente.

<converter>
    <converter-for-class>java.math.BigDecimal</converter-for-class>
    <converter-class>#{big_decimal_converter}</converter-class>
</converter>


Já que vc está trabalhando com BigDecimal, vale a pena dar uma olhada nesse post do Paulo Silveira:
http://blog.caelum.com.br/2010/07/15/arredondamento-no-java-do-double-ao-bigdecimal/

2010/10/6 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>

Fabricio Lemos

unread,
Oct 8, 2010, 10:21:56 AM10/8/10
to jav...@googlegroups.com
Hoje pela manhã, por outros motivos, tive que truncar os BigDecimals recebidos na minha entidade:

    public void setValorPercentualPagamento(BigDecimal valorPercentualPagamento) {
        this.valorPercentualPagamento = arredondarValorDecimal(valorPercentualPagamento);
    }

    protected BigDecimal arredondarValorDecimal(BigDecimal valorDecimal) {
        return valorDecimal.setScale(4, RoundingMode.HALF_UP);
    }

Essa truncagem acho que é algo legal de se fazer para todas minhas propriedades, então acho que meio que resolveu o problema.

Daí posso usar o numberConverter mesmo, que tem uns tratamentos legais, como o tipo parametrizável (percentual, numérico ou monetário). Se eu fosse querer fazer algo parecido, teria que implementar minha própria tag, que é simples também, mas é outro código que não gostaria de manter.

Marcel Maurício

unread,
Oct 8, 2010, 11:56:35 AM10/8/10
to jav...@googlegroups.com
Tu poderia fazer um extends do NumberConverter e configurar como o André citou anteriormente, excluindo a necessidade de ter que fazer tal arredondamento em cada entidade / TO.

2010/10/8 Fabricio Lemos <fabrici...@sefaz.ce.gov.br>



--

Fabricio Lemos

unread,
Oct 8, 2010, 3:07:26 PM10/8/10
to jav...@googlegroups.com
O arredondamento não é somente por causa do JSF. Faço operações em cima dos valores e quero sempre armazenar arredondado.

E se eu herdasse do NumberConverter, ainda assim teria que escrever a tag para o converter.
Reply all
Reply to author
Forward
0 new messages