Formatação de Números

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…