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:
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…
J
jonlordbrPJ
Postar outro código:
privatestaticvoidverificarNumero(Stringnumero){Localelocale=newLocale("pt","BR");NumberFormatnf=NumberFormat.getNumberInstance(locale);try{System.out.println(nf.parse(numero).doubleValue());}catch(ParseExceptione){e.printStackTrace();}}/** * @param args */publicstaticvoidmain(String[]args){// Número no formato brasleiroverificarNumero("123.456,789");// Número no formato americanoverificarNumero("123,456.789");}
A saída do código acima é:
123456.789123.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…
J
jonlordbrPJ
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:
privatestaticbooleanpodeConverterDouble(String numero, Locale locale) {//Pegaossímbolosdegrupoedecimal,dependendodolocaleDecimalFormatdf=(DecimalFormat) DecimalFormat.getInstance(locale);DecimalFormatSymbolsdfs=df.getDecimalFormatSymbols();StringnumeroTemp="";booleanachouDecimal=false;//Varrecaractereporcaracterefor(int i = 0; i < numero.length(); i++) {charn=numero.charAt(i);if(!achouDecimal && n == dfs.getGroupingSeparator()) {//Senãoachouosímbolodecimal,eachouumseparadordegrupo//Ignora} else if (!achouDecimal && n == dfs.getDecimalSeparator()) {//Senãoachouodecimal,masachouagoranumeroTemp+=".";achouDecimal=true;} else if (achouDecimal && (n == dfs.getDecimalSeparator() || n == dfs.getGroupingSeparator())) {//Sejáachouodecimal,eagoraachouodecimalouumseparadordegrupo//Erroreturnfalse;} else {//SenãonumeroTemp+=n;}}//Nestepontoonúmerodeveestarnoformato######.###
//SeestiveroparseDoublevaifuncionar,casocontrário,aentradaestáincorretatry{Double.parseDouble(numeroTemp);returntrue;} catch (NumberFormatException e) {returnfalse;}}
Obrigado pela ajuda…
Abraços…
J
jonlordbrPJ
Bom, depois de olhar na api do java 1.5, achei esse site: