Não permitir strings em inputText

5 respostas
dahenz

Pessoal estou utilizando uma tag JSF para receber uma informação do browser, essa informação deve ser numérica....

Andei pesquisando no GUJ e em outros lugares sobre alguma tag pronta e percebi que existe sim essa tag....

Utilizei ela da seguinte forma:

<h:outputText value="Valor do prêmio R$:" />
                  <h:inputText id="valorPremio"    
                    		   size="10"                            
                  			   styleClass="especialTextAlignRight"
                  			   value="#{MetaVigenciaMB.valorPremio}" >
                  			   
                  			   <f:convertNumber type="type" 
                  			   					currencySymbol=""
                  			   					currencyCode="true"
                  			   					pattern="#,##0.00" />
                  			   
                  </h:inputText>

Observem que o patter está definido com uma máscara nos padrões brasileiros, mas me traz um erro na tela

java.lang.reflect.InvocationTargetException

Alguém já conseguiu fazer funcionar um convertNumber??? Por que eu tento, tento e nada.....

Obrigado

5 Respostas

brunocl14

koe.

1º. não é necessário declarar o atributo type pois seu default já é "number". ou para o seu caso, declare "currency"

uma forma bem simples é fazer uma classe converter e chamá-la dentro da própria tag.

tive o mesmo problema que vc e achei uma solução.

Crie a classe (Ex: DoubleConvert).
package br.com.tenax.conversor;

import java.text.NumberFormat;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

public class DoubleConvert implements Converter {

	public DoubleConvert() {
	}

	public Object getAsObject(final FacesContext context,
			final UIComponent component, final String value) {

		try {
			final NumberFormat nf = NumberFormat.getInstance();
			nf.setMinimumFractionDigits(2);
			return nf.parse(value).doubleValue();
		} catch (final Exception e) {
			return 0.0D;
		}
	}

	public String getAsString(final FacesContext context,
			final UIComponent component, Object value) {

		if ((value == null) || (value.toString().trim().equals(""))) {
			value = 0.0D;
		}
		final NumberFormat nf = NumberFormat.getInstance();
		nf.setMinimumFractionDigits(2);
		return nf.format(Double.valueOf(value.toString()));
	}
}
e adicione o conversor no faces-config.
&lt;converter&gt;
  &lt;converter-id&gt;DoubleConverter&lt;/converter-id&gt;
  &lt;converter-class&gt;br.com.projeto.conversores.DoubleConvert&lt;/converter-class&gt;
 &lt;/converter&gt;
última coisa. para evitar problemas de localidade como troca de . por , nas casas decimais e de milhares defina seu locale no faces-config.
&lt;application&gt;
  &lt;locale-config&gt;
   &lt;default-locale&gt;pt_BR&lt;/default-locale&gt;
  &lt;/locale-config&gt;
 &lt;/application&gt;
deverá ficar + ou - assim:
&lt;h:outputText value="Valor do prêmio R$:" /&gt;  
  &lt;h:inputText id="valorPremio"      
               size="10"                              
                   styleClass="especialTextAlignRight"  
                   value="#{MetaVigenciaMB.valorPremio}" &gt;  
                     
                   &lt;f:converter converterId="DoubleConverter" /&gt;  // use aqui o mesmo id declarado no faces-config
                    
   &lt;/h:inputText&gt;
Outro modo de se fazer. no faces-config, defina um conversor para tudo o que for do tipo Double. então, todos os campos, inputs etc serão convertidos automaticamente sem necessidade de se declarar conversores nas tags.
&lt;converter&gt;
  &lt;converter-for-class&gt;java.lang.Double&lt;/converter-for-class&gt;
  &lt;converter-class&gt;br.com.tenax.conversor.DoubleConvert&lt;/converter-class&gt;
 &lt;/converter&gt;

espero ter ajudado. qualquer dúvida poste aqui.

abraço;

dahenz

Olá Bruno!!!

Seu exemplo é excelente!!!

Já implementei e observei que ao carregar meu formulário ele é chamado sem problemas.

Mas gostaria de chamá-lo no momento em que eu sair da minha caixa de texto!!!

Como faço isso?? Faço em JavaScript???

Obrigado pela ajuda…

brunocl14

em javascript da um pouco mais de trabalho e pode dar alguns problemas na passagem do input para o bean mas da pra fazer.

há vários exemplos de validadores monetários pela web pesquise um, coloque a função no script e chame no onblur do seu h:inputText.

abraço;

brunocl14

no meu projeto uso esta função no evento onkeypress

function valid$(campo, e) {
	var milSep = &quot;.&quot;;
	var decSep = &quot;,&quot;;
	var sep = 0;
	var key = '';
	var i = j = 0;
	var len = len2 = 0;
	var strCheck = '[telefone removido]';
	var aux = aux2 = '';
	var whichCode = (window.Event) ? e.which : e.keyCode;

	if (whichCode == 13)
		return true; // Enter
	if (whichCode == 8)
		return true; // Delete
	key = String.fromCharCode(whichCode); // Get key value from key code
	if (strCheck.indexOf(key) == -1)
		return false; // Not a valid key
	len = campo.value.length;
	for (i = 0; i &lt; len; i++)
		if ((campo.value.charAt(i) != '0') && (campo.value.charAt(i) != decSep))
			break;
	aux = '';
	for (; i &lt; len; i++)
		if (strCheck.indexOf(campo.value.charAt(i)) != -1)
			aux += campo.value.charAt(i);
	aux += key;
	len = aux.length;
	if (len == 0)
		campo.value = '';
	if (len == 1)
		campo.value = '0' + decSep + '0' + aux;
	if (len == 2)
		campo.value = '0' + decSep + aux;
	if (len &gt; 2) {
		aux2 = '';
		for (j = 0, i = len - 3; i &gt;= 0; i--) {
			if (j == 3) {
				aux2 += milSep;
				j = 0;
			}
			aux2 += aux.charAt(i);
			j++;
		}
		campo.value = '';
		len2 = aux2.length;
		for (i = len2 - 1; i &gt;= 0; i--)
			campo.value += aux2.charAt(i);
		campo.value += decSep + aux.substr(len - 2, len);
	}
	return false;
}
onkeypress=&quot;return(valid$(this,event))&quot;

assim a afunção atualiza o campo a cada tecla digitada.

dahenz

Valew amigo!!!

Tudo certo agora…

Abraço…

Criado 11 de dezembro de 2008
Ultima resposta 11 de dez. de 2008
Respostas 5
Participantes 2