Отформатируйте двойное число до хотя бы одной значащей цифры в Java / Android

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

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

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

Кайл

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


person Kyle Humfeld    schedule 12.12.2010    source источник


Ответы (2)


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

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));
    }
}
person cyber-monk    schedule 15.12.2010
comment
Спасибо, кибер-монах, похоже, это именно то, что мне нужно! - person Kyle Humfeld; 16.12.2010

person    schedule
comment
Привет, Завут! Во-первых, спасибо за ответ. Однако у меня есть пара дополнительных вопросов. Во-первых, меня интересует округление, а не усечение, поэтому я бы хотел, чтобы 0,000037 было представлено как 0,00004, а не 0,00003. Во-вторых, если мое исходное число равно 0,0000372, мне кажется, что предоставленный вами алгоритм даст 3e-7 из-за того, что последняя значащая цифра моего входного числа - это место e-7. Я ошибаюсь в этом? Еще раз спасибо за любые дополнительные разъяснения, которые вы можете предоставить! - person Kyle Humfeld; 14.12.2010
comment
Привет, Кайл. Похоже, у тебя уже есть ответ. Кстати, хороший вопрос. - person zawhtut; 23.12.2010