H:inputtext formatar decimal com virgula ou ponto

Na minha pagina, tenho um input para informar peso de produto:

E com convertNumber, tento formatar:

Neste caso, quando digito 2,345, ele captura correto.
Mas quando digito 2.345, ele pega o valor de 2345,000.

Preciso que tanto virgula quanto ponto ele formate correto, ou algo em JSF para converter virgula para ponto já no componente, pois esse valor já chega errado no meu Bean.

Instale o primefaces-extensions, ele tem o pe:inputNumber que trabalha de forma mais eficiente com valores.

O problema é que o projeto que estou trabalhando, ele esta com o primefaces 2.2 RC1, bem antigo. E o Primefaces mais atual, não mantém compatibilidade, sendo assim, não posso atualizar e tambem não consigo usar o extension, pois depende do mais atual.

Mesmo assim, o extension é uma otima dica para quem tiver o mesmo problema e estiver na versão current do prime.

Entao me responde algo, voce precisa de 3 digitos fracionarios mesmo ?

Tenta assim:

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

Fiz o teste que voce disse, e colocando o valor 2,36 ele chega no Bean correto, 2.36.
Se eu colocar o valor 2.36 ele chega no bean 236.0.

Eu preciso de 3 casas decimais, pois trabalho com pesagem de balança.

certo, agora deixe como te falei e acrescente o minFractionDigits=“3”.

Digitei 2,365, Bean 2.365.
Digitei 2.365 Bean 2365.0.

<p:inputMask> não resolveria?

vero, sera que da ? Vou fazer uns negocios aqui mais tarde apareço, se voce tiver com o mesmo problema ainda nos volta a bater head =D.

O inputMask até que resolveria, mas aparece outro problema:

Neste caso, se a pessoa quiser o valor 2.658 ela teria que digitar 02.658, ou seja, tem que respeitar a quantidade de digitos antes do ponto.
Pode ter casos que será digitado 1 ou 2 digitos à esquerda, e operacionalmente fica inviavel ter que digitar o 0 para preencher.

Não cheguei a trabalhar com o inputmask, mas se tiver alguma solução referente a este problema, posso validar aqui.

Tenta assim então amigo:

Desse modo que voce indicou, quando entra no input ele fica com a mascara 00.___, sendo assim, ao digitar ele preencher somente os decimais.
Se eu apagar o 00 e digitar, volta na mesma situacao de antes.

Conseguiu resolver ? Voltei ‘-’

Ainda não… Estou tentando de varias formas.

Utilize a 1ª forma apresentada no início desse tópico, porém insira o seguinte parâmetro em seu f:convertNumber: locale=“pt_BR”.

Sei que faz tempo que essa necessidade surgiu, mas para quem ainda tem dúvida, aí está uma opção de validação de números decimais.

O parâmetro locale configurado com o padrão “pt_BR” faz com que o “.”(ponto) seja utilizado como separador de milhar e a “,” seja utilizada como separador de casas decimais.

Caso essa configuração não seja inserida, a configuração a ser utilizada será a do idioma utilizado em seu sistema operacional.

Boa =D

Nem lembrava mais desse tópico, hehehe, apesar de a dúvida não ser minha e nunca ter tido este problema do amigo que criou este topico, eu não conhecia esse parâmetro, vlw xD

Abraços.

Ótima dica.

Eu tinha resolvido criando um conversor de double, onde o mesmo converte virgula em ponto:

@FacesConverter("DoubleConverter")
public class DoubleConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String valorTela) throws ConverterException {
		if (valorTela == null || valorTela.toString().trim().equals("")) {
			return 0.0d;
		} else {
			try {
				return Double.parseDouble(valorTela.replace(",", "."));
			} catch (Exception e) {
				return 0.0d;
			}
		}
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object valorTela) throws ConverterException {
		if (valorTela == null || valorTela.toString().trim().equals("")) {
			return "0,000";
		} else {
			NumberFormat nf = NumberFormat.getInstance(new Locale("pt", "BR"));
			nf.setMinimumFractionDigits(3);
			return nf.format(Double.valueOf(valorTela.toString()));
		}
	}
}

Depois chamava o conversor no Prime:

&lt;h:inputText converter="DoubleConverter" id="peso" onmouseup="document.getElementById('peso').value='';" onkeydown="return event.keyCode != 13" value="#{controlePedidoBean.quantidadePesavel}" styleClass="input_field_mobile" size="14"/&gt;

Não postei a solução antes por não achar adequada.

Assim que tiver disponibilidade, farei com teste com o pt_Br.
Mas quem tiver o mesmo problema, indico testar com o pt_br primeiro, caso não funcione, utilize o modo que apliquei.