Use a classe java.text.DecimalFormat observando os métodos herdados da classe ancestral abstrata NumberFormat pois Expressões Regulares são adequadas para identificar padrões e opcionalmente extrair dados.
Sugiro como exercício que faça o contrário: validar uma string contendo valor monetário via expressão regular, embora seja possível usar o método parse da classe DecimalFormat.
Não é exatamente esse o caso, Gokuro, não que discorde do que você disse, sobre a validação. Mas sem margem a dúvida, o metodo replaceAll(), foi adicionado justamente para isso, substituir termos que se encaixem, em uma ER.
Só estou procurando, conhecer e aprimorar dois recursos, ao mesmo tempo Todo caso, o que você sugeriu é, uma boa ideia! Obrigado Vamos lá!
public class ExercicioRegex {
private String valor;
public ExercicioRegex() {
this.valor = "1234567890";
}
public String getValor() {
return this.valor;
}
public static void main(String args[]) {
ExercicioRegex regex = new ExercicioRegex();
String saidaTexto = regex.getValor().replaceAll("(\\d{0,2})?(\\d{3})*(\\d{2}{1}$)", "$1.$2,$3");
boolean valorOk = saidaTexto.matches("(\\d{0,2})?(\\.\\d{3})*(,\\d{2}{1}$)");
if(!valorOk) {
saidaTexto = "Valor invalido!";
}
System.out.println("Valor: " + saidaTexto);
}
}
A saida:
Valor: 12.678,90
A validação, funcionou, a primeiro momento. Mas, não consegui, carregar os números: 3, 4 e 5; No valor de saida.
Acabei modificando a espressão regular, para ajustar a saida de acordo, com o que era previsto. O problema está em que o grupo, que antecedia o “*”, encontra diversas ocorrencias, e isso impede acesso a todos os resultados selecionados.
O codigo ficou assim:
public class ExercicioRegex {
private String valor;
public ExercicioRegex() {
this.valor = "1234567890";
}
public String getValor() {
return this.valor;
}
public static void main(String args[]) {
ExercicioRegex regex = new ExercicioRegex();
String saidaTexto = regex.getValor().replaceAll("(\\d{0,2})?(\\d{3})?(\\d{3})?(\\d{2}){1}$", "$1.$2.$3,$4");
boolean valorOk = saidaTexto.matches("(\\d{0,2})?(\\.\\d{3})*(,\\d{2}){1}$");
if(!valorOk) {
saidaTexto = "Valor invalido!";
}
System.out.println("Valor: " + saidaTexto);
}
}