Valor Monetário

Estou com uma dúvida que acredito, que a maioria já tenha passado por isto aqui.

Preciso formatar um valor monétario, vamos ao exemplo. Tenho um long que representa um valor em real sem pontos decimais.

Ou seja,

// Valor que deveria representar R$ 0,01
long valor = 1;

NumberFormat formatoReal = NumberFormat.getCurrencyInstance();
		
// Permite no minimo 2 casas decimais de precisão
formatoReal.setMinimumFractionDigits(2);
		
System.out.println("Valor em Real = " + formatoReal.format(valor));

Essa é a saída deste trecho de código

Mas o resultado esperado é :

Será que isto possível não consegui encontrar nenhum exemplo que funcione como eu preciso. E na documentação não consegui encontrar nenhuma saída para resolver este problema.

Vitor Hugo Brito de Oliveira
Analista Desenvolvedor Java

Até onde eu saiba, NumberFormat não trabalha com a implementação de dinheiro por centavos, como você fez, é sempre por unidades (reais, dólares…). Você precisaria converter o seu valor, que atualmente é um long de centavos, para um double (dividindo o seu valor por 100) ou para um BigDecimal.

Concordo, acredito que 1 é 1 é 0,01 é 0,01 :shock:

import java.text.*;

public class Tx6 {

	public static void main (String [] args) {


	 // Valor que deveria representar R$ 0,01
	 long valor = 1;

	 NumberFormat formatoReal = NumberFormat.getCurrencyInstance();

	 // Permite no minimo 2 casas decimais de precisão
	 //formatoReal.setMinimumFractionDigits(2);

 	System.out.println("Valor em Real = " + formatoReal.format((float) valor/100));

 	}

}

Na verdade, eu até acredito que seja possível implementar algo do tipo numa subclasse de NumberFormat, visto que, quando você usa getPercentInstance e manda ele formatar 0.8, vira 80% . Talvez compense dar uma fuçada.

Obrigado pelas respostas, na segunda resposta consegui matar a charada. Implementei da seguinte maneira pode até não ser a melhor implementação mas funciona. Acredito que você pode melhora-la bastante valeu pela ajuda.

Segue o código em anexo para ajudar outros que tenham a mesma dúvida que eu.

package br.com.decimal.delivery.lab;

import java.math.BigDecimal;
import java.text.NumberFormat;

public class ManipulacaoMonetaria {
	
	public static void main(String [] args){
		
	/**
	* 1 - Teste
	* O resultado do código abaixo é : 10,00
	*/
	long valorMoeda1 = 10;
	NumberFormat moeda1 = NumberFormat.getNumberInstance();
	moeda1.setMinimumFractionDigits(2);
	moeda1.setMaximumFractionDigits(2);
	String strValorFormatado = moeda1.format(valorMoeda1);
	System.out.println("Valor em Real = " + strValorFormatado);
		
	/**
	* 2 - Teste
	* O resultado do código abaixo é : R$ 10,00
	*/
	long valorMoeda2 = 10;
	NumberFormat moeda2 = NumberFormat.getCurrencyInstance();
	System.out.println("Valor em Real = " + moeda2.format(valorMoeda2));
		
	/**
	* 3 - Teste
	* O resultado do código abaixo é : R$ 1,00
	*/
	long valorMoeda3 = 100;
	NumberFormat moeda3 = NumberFormat.getCurrencyInstance();
		
	BigDecimal valorMoeda3Alterado = new BigDecimal(valorMoeda3);
	valorMoeda3Alterado = valorMoeda3Alterado.divide(new BigDecimal(100));
	System.out.println("Valor em Real = " + moeda3.format(valorMoeda3Alterado));

	}

}