2011-05-30 31 views
6

¿Cuál sería una buena manera de recortar más de dos ceros a la derecha para un BigDecimalRecorte Más de dos ceros a la derecha en BigDecimal

Así 1.2200 imprimiría 1,22 y 1,0000 imprimiría 1.00

Editar Así como para volver 1.222200 como 1.2222 y 1,220000001 1,220000001 como etc. Así que sin tener en cuenta dos primeros ceros Quiero recorte los 0s entrantes y no recortar distinto de cero valora

Una forma podría ser a multiplicarse, a continuación, aplicar el construido en el ajuste de arrastre ceros y luego dividir por 100. Podría ser problemático con casos de esquina pero los valores en mi problema están basados ​​en monedas y nunca superarían los límites establecidos por Java (o si no significa que mi software está lidiando con ofertas que están en gazzilions de dólares)

La solución fea es como folows

System.out.println(((new BigDecimal("1.230223000") 
           .multiply(new BigDecimal("100.0")) 
           .stripTrailingZeros()).divide(new BigDecimal("100.0")))); 
+0

nota de que el nuevo conflicto con los requisitos de sus originales: ¿cómo puede el '1.230223000' ser convertido en' 1.230223', pero '' 1.0000' debe imprimir 1.00'? –

+0

no, no lo hacen Joachim. Lea de nuevo. Quiero ignorar los primeros dos ceros después de decimal para recortar. Y la entrada siempre será de al menos tipo x.xx – geoaxis

+0

sí, me di cuenta de que después de publicar mi comentario. ¿Mi respuesta (actualizada) ayuda? –

Respuesta

8

comprobar esto,

import java.text.DecimalFormat; 
import java.text.NumberFormat; 

public class DecimalFormatExample 
{ 
    public static void main(String args[]) 
    { 
    double amount = 2192.015; 
    NumberFormat formatter = new DecimalFormat("#0.00"); 
    System.out.println("The Decimal Value is:"+formatter.format(amount)); 
    } 
} 
+2

Esto truncará 'nuevo BigDecimal (" 1.234 ")' que (de acuerdo con los nuevos requisitos) debe imprimirse por completo. –

13

actualización: Tener esos requisitos mixtos (es decir, al menos 2 dígitos después del punto decimal se deben mostrar, pero tantos como sea necesario) no se implementa trivial, pero que pueden acercarse:

Combinar stripTrailingZeros() con DecimalFormat para obtener el comportamiento deseado (o cerca de ella):

DecimalFormat df = new DecimalFormat("0.00########") 
String formatted = df.format(bigDecimal.stripTrailingZeros()) 

Esto formateará cualquier valor BigDecimal con al menos 2 dígitos después del punto decimal y hasta 10 dígitos después del punto decimal, si mejora la precisión.

BigDecimal valores con más de 10 dígitos después del punto decimal todavía serán cortados:

 
     input  | output 
-----------------+---------- 
1.20000   | 1.20 
1.23000   | 1.23 
1.2301   | 1.2301 
1.230001000  | 1.230001 
1.2300000000001 | 1.23 

Respuesta original:

Si siempre quiere tener exactamente 2 dígitos después de la coma y sabe que no va a perder la precisión de esta manera, entonces se puede llamar setScale(2, RoundingMode.UNNECESSARY):

System.out.println(new BigDecimal("1.23000").setScale(2, RoundingMode.UNNECESSARY)); 

Este código imprimirá 1.23. Tenga en cuenta que esto lanzará un ArithmeticException cuando sea necesario redondear (es decir, cualquier cosa después de los primeros 2 dígitos no es cero).

Si sus valores pueden tener una mayor precisión y que desea aplicar un poco de redondeo, basta con sustituir con RoundingMode.UNNECESSARYthe appropriate value:

System.out.println(new BigDecimal("1.2301").setScale(2, RoundingMode.CEILING)); 

Esto imprimirá 1.24.

Si no se conoce el número exacto de dígitos, pero desea la menor cantidad posible (es decir, desea que el más pequeño posible scale para su BigDecimal) luego llamar stripTrailingZeros() hará exactamente lo que quiere:

System.out.println(new BigDecimal("1.230001000").stripTrailingZeros(); 

Esto imprimirá 1.230001.

+0

Nota: mi respuesta asume que necesita el * valor *. Si * solo * desea formatear cómo se muestra el valor, entonces la respuesta por @Max es más apropiada. –

+0

Necesito el valor, y también quiero que funcione para el siguiente caso BigDecimal 1.230002000000 devuelve BigDecimal 1.230002 – geoaxis

+0

@geoaxis: He actualizado mi respuesta para estos requisitos modificados. –

0

Este método le dará el resultado deseado (redonda monetaria): (lo que es String porque es mejor para BigDecimal ver documentación)

public static float roundUp(String what, int howmuch) throws Exception{ 

    try { 
     return (new BigDecimal(what).setScale(howmuch, BigDecimal.ROUND_UP)).floatValue(); 
    } catch (NumberFormatException nfe) { 
     throw new Exception("BigDecimal cannot parse value : " + what, nfe); 
    } 
} 
0

Si se trata de para fines de visualización use:

BigDecimal d = new BigDecimal("1.2200"); 
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(d.doubleValue()); 
-1
BigDecimal d = new BigDecimal("59.0000"); 
String d1 = new DecimalFormat().format(d); 
System.out.println("d1 is " + d1); 
+0

esta respuesta ya fue publicada, y no cae dentro del alcance del "arma más rápida en el oeste" – Woot4Moo

0

Para la salida como String, use DecimalFormat.

De lo contrario, utilice esto:

public static BigDecimal stripToMinimumScale(BigDecimal value, 
              final int minimumScale) { 
    if (value.scale() == minimumScale) // Already correct scale 
    return value; 
    else { 
    value = value.stripTrailingZeros(); 
    return (value.scale() < minimumScale) ? 
     value.setScale(minimumScale) : // Too few decimals, needs zero pad 
     value; // Do not round any significant digits 
    } 
} 
Cuestiones relacionadas