Validando uma string como valor decimal

Estou com uma dúvida para a validação de um valor string, eu tenho que pegar este valor e validar se realmente é um valor decimal com duas casas decimais.

Verifico a string com a classe regex, porém não estou conseguindo validar os dois dígitos após a vígula. Pois deve ter somente dois dígitos e não mais.

Utilizando o código abaixo, eu verifico se a string contém somente número (0-9) e após a vírgula deve ter [b]somente duas casas decimais[b]. O problema é que ele valida como correto mesmo que tenha mais que dois valores após a vírgula. Não está verificando se tem somente dois. :?

[code]
private void notifyEvent(String validate) {
this.validate = validate;
Pattern pattern = Pattern.compile("[0-9]?,[0-9]{2}");
Matcher matcher = pattern.matcher(validate);

 try{							
 if (matcher.find()) {
       System.out.println("Valor validado - OK");
 } else {    
      System.out.println("Valor incorreto");
 }      
 }
catch (Exception ex){			
	ex.printStackTrace();
}

}[/code]

Quem puder ajudar eu agradeço. :smiley:

Acho que é isso que você precisa:

System.out.println (	Pattern.matches ("(\d)*,\d{2}+","12,2222"));//imprime false
System.out.print (	Pattern.matches ("(\d)*,\d{2}+","12,22"));//imprime true

O primeiro parâmetro que o método estático matches espera receber é a expressão regular que você quer usar pra validar.
O segundo é o treco que deve ser validado. (Deu pra deduzir né?! eu sei…eu sei…)

Bom, se ficou alguma dúvida na expressão regular utilizada, é o seguinte:

\d significa o mesmo que [0-9], ou seja, qualquer dígito de 0 a 9. (OBS: é necessário colocar duas barras, uma pertence à própria expressão regular. A outra é para que o compilador não pense que se trata de uma sequência de escape inválida.

Então:

(\d)* significa um dígito, 0 ou mais vezes.
\d{2}+ significa exatamente duas vezes.
, significa ,. hehehe

FONTE.

Qualquer dúvida posta aí.

Tenta o seguinte:

String str = "123456,391234123";

if(str.matches("\d+\,\d{2}")){
    System.out.println("Valor validado - OK");

}else{
    System.out.println("Valor incorreto");
}

Obrigado pela atenção XD

Então, a minha solução a príncipio esta a msma, porém utilizei matcher.find() para verificar se estava tudo conforme padrão. Mas pelo que entendi, esse .find() só verifica se tem e não como o padrão que foi especificado.

Vou utilizar a sua solução a partir de agora, mas colocando na condição o próprio padrão, dessa maneira:

if (Pattern.matches ("(\d)*,\d{2}+",validate)) {
      System.out.println("Valor validado - OK");
      } else {    
      System.out.println("Valor incorreto");
      }      
}

E assim funcionou como eu queria!!! :smiley:

Muito obrigado ai pessoal.

O find() serve pra você ir percorrendo a fonte a ser comparada pouco a pouco…Ou seja, ideal pra ser colocado como condição de um while…
O matches compara a fonte inteira de uma vez só…