2010-12-12 13 views
5

Tôi có một đối tượng DecimalFormat mà tôi đang sử dụng để định dạng tất cả các giá trị kép của mình thành số chữ số được đặt (giả sử 2) khi tôi hiển thị chúng. Tôi muốn nó thường định dạng thành 2 chữ số thập phân, nhưng tôi luôn muốn có ít nhất một chữ số có nghĩa. Ví dụ, nếu giá trị của tôi là 0,2 thì trình định dạng của tôi phun ra 0,20 và điều đó thật tuyệt. Tuy nhiên, nếu giá trị của tôi là 0.000034 trình định dạng của tôi sẽ nhả ra 0,00 và tôi muốn trình định dạng của tôi nhổ ra 0,003003.Định dạng gấp đôi thành ít nhất một chữ số quan trọng trong Java/Android

Số định dạng trong Objective-C làm điều này rất đơn giản, tôi chỉ có thể đặt số chữ số tối đa tôi muốn hiển thị ở 2 và số chữ số có nghĩa tối thiểu ở 1 và nó tạo ra kết quả mong muốn của tôi, nhưng cách Tôi làm điều đó trong Java?

Tôi đánh giá cao bất kỳ trợ giúp nào mà bất kỳ ai cũng có thể cung cấp cho tôi.

Kyle

Chỉnh sửa: Tôi muốn làm tròn giá trị để 0.000037 hiển thị là 0,00004.

Trả lời

2

Nó không hiệu quả, vì vậy nếu bạn thực hiện thao tác này thường thì tôi sẽ thử giải pháp khác, nhưng nếu bạn chỉ gọi nó đôi khi phương pháp này sẽ hoạt động.

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

Cảm ơn, cyber-monk, trông giống như chính xác những gì tôi cần! –

+0

@Kyle, chào mừng bạn! –

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

Hey Zawhtut! Trước hết, cảm ơn bạn đã trả lời. Tôi có một vài câu hỏi bổ sung, mặc dù. Đầu tiên, tôi quan tâm đến làm tròn hơn là cắt xén, vì vậy tôi muốn 0,000037 được biểu diễn là 0.00004 thay vì 0.00003. Thứ hai, nếu số ban đầu của tôi là 0.0000372, có vẻ như thuật toán bạn cung cấp sẽ mang lại 3e-7, do thực tế là con số quan trọng cuối cùng của số đầu vào của tôi là địa chỉ e-7. Tôi có căn cứ vào điều đó không? Cảm ơn bạn một lần nữa vì đã làm rõ thêm bạn có thể cung cấp! –

+0

Xin chào Kyle. Có vẻ như bạn đã có câu trả lời. Một câu hỏi tốt bằng cách này. – zawhtut