Existe alguma classe que converta uma String que representa um numero no formato brasileiro para outra String no formato americano (que possa ser feito parse)?
Ex:
pegue 2.000,388 e converta para 2000.388
pegue 20.00,28 e diga que tem erro
pegue 2000,82 e converte para 2000.82
e assim por diante…
Ou alguem sabe como implementar essas mascaras nos inputText do jsf, existe algum converter para isso?
Se você quer converter um número no formato brasileiro para o americano apenas para fazer a conversão, não precisa, você pode fazer a conversão direto no número.
Pra isso, você não vai usar o Double.parseDouble (que só converte números num formato quase igual ao americano), e sim, um NumberFormat:
public double converter(String s) throws ParseException {
NumberFormat fmt = new DecimalFormat("#,##0.00");
// new DecimalFormat("#,##0.00", new DecimalFormatSymbols(new Locale("pt", "BR"));
return fmt.parse(s).doubleValue();
}
Use esse código se o Locale padrão da máquina que for rodar esse código for do Brasil. Caso contrário, use a linha de baixo, que explicita que o Locale deve ser pt_BR.
fabiozoroastro, valeu pela ajuda, mas ainda da erro no seu codigo, tenta 1.911,98.
CD1, obrigado tb, eu ja tinha achado essa classe (uso para converter no formato para mostrar na tela, quando eu sei que o número esta certo, ou seja, fazer o inverso), problema que ela não valida esse tipo de coisa “1.9.1.1,98”, ele me retorna 1911,98 e eu não queria deixar digitar essas “bizarrices”, de qualquer forma valeu mesmo.
Bem, deixa para la, eu queria saber se existia algo ja pronto para isso, mas enquanto não acho vou usando o que criei aqui mesmo, ficou complicadinho, bizarro, feio, xunxado, mas acho que funciona hehe
public String conv(String number)
{
if (number == null) return null;
String[] string = number.replace(".", "#").split("#"); //sim, não consegui fazer aplit com o ".", e não sei qual o pattern para fazer hehe
boolean first = true;
boolean last = false;
if (string.length > 1)
{
for (String str : string)
{
if (last) return "";
int tam = str.length();
int virg = str.indexOf(",");
if (virg >= 0)
{
tam = str.substring(0, virg).length();
if (str.lastIndexOf(",") != virg) return "";
last = true;
}
if ((first) && (tam > 3) || ((tam < 1)))
{
return "";
}
else if ((!first) && (tam != 3))
{
return "";
}
first = false;
}
}
try
{
// retorna um numero com decimais caso tenha sido informado e o decimal não for 0
int ix = number.indexOf(",");
if ((ix > 0) && (Integer.parseInt(number.substring(ix + 1)) != 0))
return Double.valueOf(number.replace(".", "").replace(",", ".")).toString();
else
return ix > 0 ? Long.valueOf(number.substring(0, ix).replace(".", "")).toString() : Long.valueOf(number.replace(".", "")).toString();
}
catch (NumberFormatException e)
{
return "";
}
}