Primeiro, String.valueOf
serve para converter algum valor para String
. Mas o método format
já retorna uma String
, então usar valueOf
neste caso é redundante e desnecessário. Veja:
int valor = 1000;
NumberFormat df = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
String comValueOf = String.valueOf(df.format(valor));
String semValueOf = df.format(valor);
System.out.println(comValueOf.equals(semValueOf)); // true (as strings são iguais)
Então não precisa usar String.valueOf
.
Segundo, você viu o valor retornado por format
?
NumberFormat df = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
System.out.println(df.format(1000)); // R$ 1.000,00
Se o valor for 1000
, o resultado é R$ 1.000,00
. Então o replace
que tem ali não é o suficiente, pois você troca a vírgula por ponto, resultando em R$ 1.000.00
, e Double.parseDouble
não consegue interpretar o “R$” (não faz parte de um valor numérico válido). Então você até poderia remover tudo que não é número:
public static double formatDecimal(int valor) {
NumberFormat df = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
String valor2 = df.format(valor / 100.0);
System.out.println(valor2);
valor2 = valor2.replaceAll("\\D+", ""); // tira tudo que não é número
// como a string tem os centavos, tenho que dividir por 100 de novo
return Double.parseDouble(valor2) / 100.0;
}
Ou usar o próprio NumberFormat
para fazer o parsing da String
:
public static double formatDecimal(int valor) throws ParseException {
NumberFormat df = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
String valor2 = df.format(valor / 100.0);
System.out.println(valor2);
// parse converte a string de volta para número
return df.parse(valor2).doubleValue();
}
Mas acho que na verdade nada disso é necessário
Você quer que o método retorne o valor dividido por 100, e também imprima o valor formatado? Então faça assim:
public static double formatDecimal(int centavos) {
double reais = centavos / 100.0;
NumberFormat df = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
System.out.println(df.format(reais));
return reais;
}
Não tem porque transformar o valor em String
para depois converter esta String
de volta para número. Você já tem o valor numérico ali, basta usá-lo.
Na verdade eu também questionaria se o mesmo método deve ser responsável por converter o valor de centavos para reais e ao mesmo tempo mostrar o valor formatado. Eu separaria o cálculo da formatação, pois embora estejam relacionados, são 2 funções diferentes:
public static double converterCentavosParaReais(int centavos) {
return centavos / 100.0;
}
public static String formatar(double valor) {
NumberFormat df = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
return df.format(valor);
}
public static void main(String[] args) throws Exception {
int centavos = 100000;
double reais = converterCentavosParaReais(centavos);
System.out.println(formatar(reais)); // R$ 1.000,00
}