thousands round number funciona decimales como java format decimal decimalformat

round - Formato, 2 decimales para doble y 0 para entero en java



string.format java double (2)

Creo que necesitamos una declaración if.

static double intMargin = 1e-14; public static String myFormat(double d) { DecimalFormat format; // is value an integer? if (Math.abs(d - Math.round(d)) < intMargin) { // close enough format = new DecimalFormat("#,##0.##"); } else { format = new DecimalFormat("#,##0.00"); } return format.format(d); }

El margen permitido para que un número se considere como un número entero se debe elegir según la situación. Simplemente no suponga que siempre tendrá un número entero exacto cuando lo espera, los dobles no siempre funcionan de esa manera.

Con la declaración anterior, myFormat(4) devuelve 4 , myFormat(4.98) devuelve 4.98 y myFormat(4.0001) devuelve 4.00 .

Estoy tratando de formatear un doble a 2 lugares decimales exactos si tiene fracción, y cortarlo de lo contrario usando DecimalFormat

Entonces, me gustaría lograr los próximos resultados:

100.123 -> 100.12 100.12 -> 100.12 100.1 -> 100.10 100 -> 100

Variante n. ° 1

DecimalFormat("#,##0.00") 100.1 -> 100.10 but 100 -> 100.00

Variante n. ° 2

DecimalFormat("#,##0.##") 100 -> 100 but 100.1 -> 100.1

¿Alguna idea de qué patrón elegir en mi caso?


La única solución a la que llegué es usar una sentencia como se mencionó aquí: https://.com/a/39268176/6619441

public static boolean isInteger(BigDecimal bigDecimal) { int intVal = bigDecimal.intValue(); return bigDecimal.compareTo(new BigDecimal(intVal)) == 0; } public static String myFormat(BigDecimal bigDecimal) { String formatPattern = isInteger(bigDecimal) ? "#,##0" : "#,##0.00"; return new DecimalFormat(formatPattern).format(bigDecimal); }

Pruebas

myFormat(new BigDecimal("100")); // 100 myFormat(new BigDecimal("100.1")); // 100.10

Si alguien sabe de manera más elegante, ¡por favor compártelo!