Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

152
Views
¿Es posible tener varias configuraciones regionales en un mismo formato de mensaje?

Tengo el siguiente ejemplo JSON a continuación:

 { "value": 946.2, "description": "O valor é R$ 946,20." }

Necesito usar MessageFormat para probar JUnit este ejemplo de JSON, pero obtengo un valor no válido porque mi Locale no está en inglés. Si cambio mi configuración regional a inglés en lugar de portugués brasileño, obtengo una descripción no válida porque el valor de la moneda se muestra en inglés.

Aquí está mi código:

 import java.math.BigDecimal; import java.text.MessageFormat; import java.util.Locale; Locale.setDefault(Locale.ENGLISH); System.out.println(MessageFormat.format(""" '{' "value": {0}, "description": "O valor é {0,number,currency}." '}' """, new BigDecimal(946.2)));

¿Cómo puedo formatear el valor o la descripción para obtener el JSON como se muestra arriba?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

¡Claro, no hay problema! Pero:

  • Locale.setDefault es duro! (para la prueba, puede ser tolerable... pero no quiero buscar ese error...)
  • ("No me gusta" MessageFormat ... usa StringBuffer internamente (Mr. Performance Killer & Memory dumper)).

Siempre que pueda manejar la "complejidad", se puede hacer como:

 import java.math.BigDecimal; import java.text.MessageFormat; import java.text.NumberFormat; import java.util.Locale; public class MainSimple { // Brazilian Locale: private static final Locale LOCALE_PT_BR = new Locale.Builder(). setLanguage("pt"). setRegion("BR"). build(); // US number format: private static final NumberFormat DEFAULT_NUMBER_FMT = NumberFormat.getNumberInstance(Locale.US); public static void main(String[] args) { // MessageFormat instance, with format (with 2! parameters) and Locale: MessageFormat mainFmt = new MessageFormat(""" '{' "value": {0}, "description": "O valor é {1,number,currency}. <-- trick 1 " '}' """, LOCALE_PT_BR); final BigDecimal num = new BigDecimal(946.2); // trick 2: Object[] params = {DEFAULT_NUMBER_FMT.format(num), num}; // do it: System.out.println(mainFmt.format(params)); } }

Esquema:

  • Constantes para:
    • Configuración regional brasileña (formato externo).
    • Formato de número de EE. UU./estándar (interno) para formato personalizado (no brasileño)/este número en particular.
  • ¡ MessageFormat tiene un constructor con parámetro de configuración regional ! ( usamos eso , y lo llamamos formato externo/local ( mainFmt ))
  • En el formato "engañamos un poco" y usamos 2 parámetros: {0} y {1,number,currency}
  • Nos engañamos: pase el primer parámetro como una String (número con formato de EE. UU.), el segundo como lo había hecho. ( Object[] params = {DEFAULT_NUMBER_FMT.format(num), num} )
  • finalmente formatee (e imprima para salir).

Huellas dactilares:

 { "value": 946.2, "description": "O valor é R$ 946,20." }
over 4 years ago · Santiago Trujillo Report

0

Esta es una solución String.format con dos NumberFormat ters internos (localizados, personalizados):

 import java.math.BigDecimal; import java.text.NumberFormat; import java.util.Locale; public class OtherMain { private static final Locale LOCALE_PT_BR = new Locale.Builder(). setLanguage("pt"). setRegion("BR"). build(); private static final NumberFormat DEFAULT_NUMBER_FMT = NumberFormat.getNumberInstance(Locale.US); private static final NumberFormat MY_SPECIAL_NUMBER_FMT = NumberFormat.getCurrencyInstance(LOCALE_PT_BR); static { // this disables "thousands sperarator", we can adjust DEFAULT_NUMBER_FMT as well... MY_SPECIAL_NUMBER_FMT.setGroupingUsed(false); } public static void main(String[] args) { final BigDecimal num = new BigDecimal(99946.2); System.out.format(""" { "value": %s, "description": "O valor é %s." } """, DEFAULT_NUMBER_FMT.format(num), MY_SPECIAL_NUMBER_FMT.format(num) ); } }

Huellas dactilares:

 { "value": 99,946.2, "description": "O valor é R$ 99946,20." }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!