Olá,
Estou com o problema de formatação de números. O problema é que eu tenho uma string, e gostaria de saber se este número é válido para um determinado locale. Por exemplo:
345 987,246 fr_FR
345.987,246 de_DE
345,987.246 en_US
Como poderia fazer isso, lembrando que eu não posso setar máscaras de formatação, tem que ser à partir das configurações de um determinado locale.
Não sei se consegui ser claro na minha dúvida, e não sei também se estou “viajando”.
Obrigado…
Bem, eu não entendi… :roll: , tu quer passar esses números pra qual formato? Respeitando quais regras?
Oi…
Ow dúvida difícil de explicar. Olhe o seguinte código:
NumberFormat nf = NumberFormat.getInstance(locale);
System.out.println(nf.format(123456789.123));
Vamos supor que o locale seja:
new Locale("pt", "BR");
A saída será:
123.456.789,123
Agora se o locale for:
Locale.US;
A saída será:
123,456,789.123
O meu problema é o seguinte, vamos supor que eu sete o locale para o pt-BR, eu queria saber se os números (representados como String) 123.456.789,123 e 123,456,789.123 são válidos. Sendo que neste locale (pt-BR) só o primeiro é válido. Enquanto no locale US, só o segundo número é válido.
Abraços…
Postar outro código:
private static void verificarNumero(String numero) {
Locale locale = new Locale("pt", "BR");
NumberFormat nf = NumberFormat.getNumberInstance(locale);
try {
System.out.println(nf.parse(numero).doubleValue());
} catch (ParseException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// Número no formato brasleiro
verificarNumero("123.456,789");
// Número no formato americano
verificarNumero("123,456.789");
}
A saída do código acima é:
123456.789
123.456
O que eu esperava é que a segunda chamada a função verificarNumero gerasse uma exceção, já que eu passei um número no formato americano. Mas o que aconteceu foi que ele converteu o número até a segunda vírgula, e descartou o resto. O certo não seria o método parse jogar a exceção ParseException???
Abraços…
Depois de muito pensar, arrumei uma solução (não sei se é a melhor, nem se é uma boa solução). Por favor, respondam o que vocês acham dessa solução:
private static boolean podeConverterDouble(String numero, Locale locale) {
// Pega os símbolos de grupo e decimal, dependendo do locale
DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(locale);
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
String numeroTemp = "";
boolean achouDecimal = false;
// Varre caractere por caractere
for (int i = 0; i < numero.length(); i++) {
char n = numero.charAt(i);
if (!achouDecimal && n == dfs.getGroupingSeparator()) {
// Se não achou o símbolo decimal, e achou um separador de grupo
// Ignora
} else if (!achouDecimal && n == dfs.getDecimalSeparator()) {
// Se não achou o decimal, mas achou agora
numeroTemp += ".";
achouDecimal = true;
} else if (achouDecimal && (n == dfs.getDecimalSeparator() || n == dfs.getGroupingSeparator())) {
// Se já achou o decimal, e agora achou o decimal ou um separador de grupo
// Erro
return false;
} else {
// Senão
numeroTemp += n;
}
}
// Neste ponto o número deve estar no formato ######.###
// Se estiver o parseDouble vai funcionar, caso contrário, a entrada está incorreta
try {
Double.parseDouble(numeroTemp);
return true;
} catch (NumberFormatException e) {
return false;
}
}
Obrigado pela ajuda…
Abraços…
Bom, depois de olhar na api do java 1.5, achei esse site:
http://java.sun.com/j2se/1.5.0/docs/guide/lang/enhancements.html#5.0
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html
A classe Scanner pode ser utilizada para converter textos em tipos primitivos.
Scanner s = new Scanner(texto);
s.useLocale(locale);
try {
s.nextShort();
return true;
} catch (InputMismatchException e) {
return false;
}
Obrigado a todos…
Abraços…