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!