Отформатируйте от двух до хотя бы одной значащей цифры в Java / Android - PullRequest
5 голосов
/ 13 декабря 2010

У меня есть объект DecimalFormat, который я использую для форматирования всех моих двойных значений в заданное количество цифр (скажем, 2), когда я их отображаю. Я хотел бы, чтобы он обычно форматировался до 2 десятичных знаков, но я всегда хочу по крайней мере одну значащую цифру. Например, если мое значение равно 0,2, то мой форматер выплевывает 0,20, и это здорово. Однако, если мое значение равно 0,000034, мой форматер будет выплевывать 0,00, и я бы предпочел, чтобы мой форматер выплевал 0,00003.

Форматировщики чисел в Objective-C делают это очень просто, я могу просто установить максимальное количество цифр, которое я хочу показать на 2, и минимальное количество значащих цифр на 1, и это даст желаемый результат, но как я могу это сделать? сделать это на Java?

Я ценю любую помощь, которую мне может предложить.

Кайл

Редактировать: меня интересует округление значений, чтобы 0,000037 отображалось как 0,00004.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Это неэффективно, поэтому, если вы выполняете эту операцию часто, я бы попробовал другое решение, но если вы вызываете его только изредка, этот метод будет работать.

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 голосов
/ 13 декабря 2010
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;
    }
}
...