Cómo dar formato a un número como cadena de moneda en Java

En esta guía, utilizará Java para dar formato a un número en una cadena de moneda. Usamos objetos Locale, Currency y NumberFormat.

Introducción

La moneda es una parte muy importante de nuestro mundo moderno. Por lo tanto, es igualmente importante para nosotros poder expresarlo correctamente en Java.

En este tutorial, repasaremos cómo formatear números como cadenas de moneda en Java.

Número de formato como cadena de moneda

Así es como puede formatear fácilmente un número, como un ‘doble’ en una cadena de moneda:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
double currencyAmount = 1500.00;
// Create a new Locale
Locale usa = new Locale("en", "US");
// Create a Currency instance for the Locale
Currency dollars = Currency.getInstance(usa);
// Create a formatter given the Locale
NumberFormat dollarFormat = NumberFormat.getCurrencyInstance(usa);

// Format the Number into a Currency String
System.out.println(dollars.getDisplayName() + ": " + dollarFormat.format(currencyAmount));

Si ejecutamos este código, dará como resultado:

1
US Dollar: $1,500.00

Formatear números en diferentes monedas implica algunas clases de Java. Nuestro ejemplo hizo uso de las clases Locale y Currency del paquete java.util. Además, usamos la clase NumberFormat, que se puede encontrar en el paquete java.text.

Profundicemos más en estas clases y escribamos un método que formatee nuestro número en múltiples monedas, dependiendo de una entrada.

La clase local

Cada objeto Locale expresa una región geopolítica e incluye información como el idioma y la ubicación. Los países tienen formas únicas de expresar la moneda. En lugar de tener que formatear manualmente cada moneda de manera diferente, el uso de objetos Locale nos permite automatizar este proceso.

Para crear un nuevo objeto Locale, podemos usar uno de los tres constructores disponibles:

1
2
3
Locale(String language);
Locale(String language, String country);
Locale(String language, String country, String variant);

Tenga en cuenta, sin embargo, que los parámetros String para los constructores no pueden ser arbitrarios. Puede encontrar una lista completa de todas las configuraciones regionales admitidas en Java 8 [aquí] (https://www.oracle.com/java/technologies/javase/jdk8-jre8-suported-locales.html).

Ahora vamos a crear algunos objetos Locale de ejemplo. Haremos referencia a estos más adelante cuando estemos creando el método real para imprimir moneda:

1
2
3
Locale usa = new Locale("en", "US");
Locale germany = new Locale("de", "DE");
Locale japan = new Locale("jp", "JP");

Dado que estamos trabajando con la moneda, el primer parámetro String, idioma, dictará el formato del valor de la moneda (por ejemplo, 1.000.000,00 o 1.000.000,00). El segundo parámetro String, región, determinará qué signo de moneda se utiliza (por ejemplo, $ o ¥).

La clase de moneda

La segunda clase que necesitamos entender es la clase Moneda. Cada objeto ‘Moneda’ representa una moneda mundial. Queremos obtener una moneda dada nuestra Configuración regional, por lo que usaremos el siguiente método:

1
Currency.getInstance(Locale locale);

Esto devolverá la instancia de ‘Currency’ correspondiente para el parámetro ‘Locale’ especificado. Entonces, usando los objetos Locale que creamos previamente, esto es lo que haremos:

1
2
3
Currency dollars = Currency.getInstance(usa);
Currency euros = Currency.getInstance(germany);
Currency yen = Currency.getInstance(japan);

Ahora que hemos creado nuestras tres instancias de Moneda, podemos pasar a nuestra próxima clase.

La clase NumberFormat

La clase NumberFormat tiene métodos para dar formato a los números según la configuración regional. Los países tienen diferentes formas de agrupar números. Por ejemplo, mil se puede representar como "1000", "1 000", "1 000" y otras variaciones.

Usaremos el método NumberFormat.getCurrencyInstance(Locale l). Este método devuelve un objeto NumberFormat que corresponde al parámetro Locale especificado. Así es como lo usaremos en nuestro método:

1
2
3
NumberFormat dollarFormat = NumberFormat.getCurrencyInstance(usa);
NumberFormat eurosFormat = NumberFormat.getCurrencyInstance(germany);
NumberFormat yenFormat = NumberFormat.getCurrencyInstance(japan);

Crear un método para imprimir un número como moneda {#crear un método para imprimir un número como moneda}

Ahora que hemos aprendido acerca de las tres clases necesarias para este programa, podemos comenzar a escribir el método real para imprimir un “doble” con formato de moneda.

También aceptaremos una Cadena, especificando en qué moneda nos gustaría imprimirla como:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public static void printCurrency(double currencyAmount, String outputCurrency) {
    Locale locale;
        
    if (outputCurrency.equals("Yen")) {
        locale = new Locale("jp", "JP");
    } else if(outputCurrency.equals("Euros")) {
        locale = new Locale("de", "DE");
    } else if (outputCurrency.equals("Dollars")) {
        locale = new Locale("en", "US");
    } else {
        locale = new Locale("en", "US");
    }
        
    Currency currency = Currency.getInstance(locale);
    NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
    
    System.out.println(currency.getDisplayName() + ": " + numberFormat.format(currencyAmount)); 

    }
}

Probemos este método llamándolo y pasando los argumentos apropiados:

1
2
3
printCurrency(1000000.00, "Yen");
printCurrency(1000000.00, "Dollars");
printCurrency(1000000.00, "Euros");

Esto resulta en:

1
2
3
Japanese Yen: JPY 1,000,000
US Dollar: $1,000,000.00
Euro: 1.000.000,00 

Para este ejemplo, usamos un ‘doble’ e imprimimos como moneda con el formato adecuado. Otros tipos de números también funcionarían, pero le recomendamos que se quede con el “doble” para los valores de moneda.

Conclusión

En este artículo, aprendimos un poco sobre las clases Locale, Currency y NumberFormat. Luego aplicamos este conocimiento en un método que nos permitió formatear e imprimir correctamente un “doble” como moneda.

Licensed under CC BY-NC-SA 4.0