Формат вдвое до одной значительной цифры в Java / Android
-
09-10-2019 - |
Вопрос
У меня есть объект decimalformat, который я использую для форматирования всех моих двойных значений на заданный номер цифр (скажем 2), когда я их покажу. Я хотел бы, чтобы это нормально отформатировано до 2 десятичных знаков, но я всегда хочу хотя бы одну значительную цифру. Например, если мое значение равно 0,2, то мой форматер выплесет 0,20, и это здорово. Однако, если мое значение составляет 0,000034, мой Fixthatter выплюнет 0,00, и я бы предпочел, что мой форматер выпил 0,00003.
Количество форматировац в Objective-C делает это очень просто, я могу просто установить максимальное количество цифр, которое я хочу показать на 2 и минимальное количество значимых цифр в 1 и производит мой желаемый выход, но как я могу это сделать в Джава?
Я ценю любую помощь, которую кто-нибудь может предложить мне.
Камин
Редактировать: Я заинтересован в округление значений, так что 0,000037 отображается как 0,00004.
Решение
Это не эффективно, поэтому, если вы выполняете эту операцию часто, я бы попробую другому решению, но если вы звоните только изредка, этот метод будет работать.
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));
}
}
Другие советы
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;
}
}