Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Format double to at least one significant digit in Java/Android

I have a DecimalFormat object which I'm using to format all of my double values to a set number of digits (let's say 2) when I'm displaying them. I would like it to normally format to 2 decimal places, but I always want at least one significant digit. For example, if my value is 0.2 then my formatter spits out 0.20 and that's great. However, if my value is 0.000034 my formatter will spit out 0.00 and I would prefer my formatter spit out 0.00003.

The number formatters in Objective-C do this very simply, I can just set a max number of digits I want to show at 2 and the minimum number of significant digits at 1 and it produces my desired output, but how can I do it in Java?

I appreciate any help anyone can offer me.

Kyle

Edit: I'm interested in rounding the values so 0.000037 displays as 0.00004.

like image 549
Kyle Humfeld Avatar asked Dec 12 '10 23:12

Kyle Humfeld


People also ask

How do you change significant figures in Java?

To do this, one can use a DecimalFormat object, say initialzed with a "0.000" String ( new DecimalFormat("0.000") ), or use String. format("%. 3f", myDouble) , or several other ways.

What is the format specifier for double data type in Java?

Just use %. 2f as the format specifier. This will make the Java printf format a double to two decimal places. /* Code example to print a double to two decimal places with Java printf */ System.

Does string format round Java?

The String. format() method is typically to format a string in Java. It can also be used for rounding a double number to 2 decimal places.

What are format specifiers in Java?

Java String Format Specifiersdecimal number, possibly in scientific notation depending on the precision and value. %h. any type. Hex String of value from hashCode() method. %n.


1 Answers

It's not efficient, so if you perform this operation often I'd try another solution, but if you only call it occasionally this method will work.

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));
    }
}
like image 99
cyber-monk Avatar answered Sep 29 '22 20:09

cyber-monk