2010-12-12 10 views
5

Tengo un objeto DecimalFormat que estoy usando para formatear todos mis valores dobles a un número de dígitos (digamos 2) cuando los estoy mostrando. Me gustaría que normalmente formatee con 2 decimales, pero siempre quiero al menos un dígito significativo. Por ejemplo, si mi valor es 0.2 entonces mi formateador escupe 0.20 y eso es genial. Sin embargo, si mi valor es 0.000034 mi formateador escupirá 0.00 y preferiría que mi formateador escupe 0.00003.Formato de doble a al menos un dígito significativo en Java/Android

Los formateadores de números en Objective-C hacen esto de manera muy simple, puedo establecer un número máximo de dígitos que quiero mostrar en 2 y el número mínimo de dígitos significativos en 1 y produce el resultado deseado, pero ¿cómo puedo Lo hago en Java?

Agradezco cualquier ayuda que alguien pueda ofrecerme.

Kyle

Editar: Estoy interesado en el redondeo de los valores así como pantallas 0,000037 0,00004.

Respuesta

2

no es eficiente, por lo que si realiza esta operación a menudo que me gustaría probar otra solución, pero si sólo se llama en ocasiones este método funcionará.

import java.text.DecimalFormat; 
public class Rounder { 
    public static void main(String[] args) { 
     double value = 0.0000037d; 
     // size to the maximum number of digits you'd like to show 
     // used to avoid representing the number using scientific notation 
     // when converting to string 
     DecimalFormat maxDigitsFormatter = new DecimalFormat("#.###################"); 
     StringBuilder pattern = new StringBuilder().append("0.00"); 
     if(value < 0.01d){ 
      String s = maxDigitsFormatter.format(value); 
      int i = s.indexOf(".") + 3; 
      while(i < s.length()-1){ 
       pattern.append("0"); 
       i++; 
      } 
     } 
     DecimalFormat df = new DecimalFormat(pattern.toString()); 
     System.out.println("value   = " + value); 
     System.out.println("formatted value = " + maxDigitsFormatter.format(value)); 
     System.out.println("pattern   = " + pattern); 
     System.out.println("rounded   = " + df.format(value)); 
    } 
} 
+0

¡Gracias, ciber monje, que parece casi exactamente lo que necesito! –

+0

@Kyle, ¡bienvenido! –

0
import java.math.BigDecimal; 
import java.math.MathContext; 


public class Test { 

    public static void main(String[] args) { 
     String input = 0.000034+""; 
     //String input = 0.20+""; 
     int max = 2; 
     int min =1; 
     System.out.println(getRes(input,max,min)); 
    } 

    private static String getRes(String input,int max,int min) { 
     double x = Double.parseDouble(((new BigDecimal(input)).unscaledValue().intValue()+"").substring(0,min)); 
     int n = (new BigDecimal(input)).scale(); 
     String res = new BigDecimal(x/Math.pow(10,n)).round(MathContext.DECIMAL64).setScale(n).toString(); 
     if(n<max){ 
      for(int i=0;i<max;i++){ 
       res+="0"; 
      } 
     } 
     return res; 
    } 
} 
+0

¡Hola Zawhtut! Primero, gracias por la respuesta. Sin embargo, tengo un par de preguntas adicionales. En primer lugar, estoy interesado en redondear en lugar de truncar, por lo que me gustaría que 0.000037 se representara como 0.00004 en lugar de 0.00003. En segundo lugar, si mi número original es 0.0000372, me parece que el algoritmo que proporcionó rendirá 3e-7, debido al hecho de que la última cifra significativa de mi número de entrada es como el lugar e-7. ¿Estoy fuera de base en eso? ¡Gracias de nuevo por cualquier aclaración adicional que pueda proporcionar! –

+0

Hola Kyle. Parece que ya tienes una respuesta. Una buena pregunta por cierto. – zawhtut

Cuestiones relacionadas