2010-02-20 12 views
23

Tôi muốn thay đổi độ chính xác của biểu diễn kép trong chuỗi Tôi đang định dạng dựa trên đầu vào của người dùng. Ngay bây giờ tôi đang cố gắng một cái gì đó như:Làm thế nào để Java String.format với độ chính xác biến?

String foo = String.format("%.*f\n", precision, my_double); 

Tuy nhiên tôi nhận được một java.util.UnknownFormatConversionException. Cảm hứng của tôi cho phương pháp này là C printf và this resource (phần 1.3.1).

Tôi có lỗi cú pháp đơn giản ở đâu đó, Java có hỗ trợ trường hợp này hay không hoặc có cách tiếp cận tốt hơn không?

Edit:

Tôi cho rằng tôi có thể làm điều gì đó như:

String foo = String.format("%." + precision + "f\n", my_double); 

nhưng tôi vẫn muốn được quan tâm trong nước hỗ trợ cho một hoạt động như vậy.

Trả lời

18

Bạn đã trả lời câu hỏi của riêng bạn - tạo chuỗi định dạng động ... chuỗi định dạng hợp lệ theo các quy ước được nêu tại đây: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax.

Nếu bạn muốn có một chữ số thập phân được định dạng đó chiếm tổng số 8 ký tự (kể cả dấu thập phân) và bạn muốn 4 chữ số sau dấu thập phân, chuỗi định dạng của bạn sẽ giống như "% 8.4f" ...

Để kiến thức của tôi không có "hỗ trợ bản địa" trong Java ngoài các chuỗi định dạng được linh hoạt.

2

Tại sao không:

String form = "%."+precision+"f\n"; 
String foo = String.format(form, my_double); 

hay:

public static String myFormat(String src, int precision, Object args...) 
{ 
    String form = "%."+precision+"f\n"; 
    return String.format(form, args); 
} 
+2

Vì vậy, bạn đề nghị OP cái gì đó ông đã biết và thêm vào trong câu hỏi của anh? – Tom

+0

Tôi chủ yếu đề xuất OP để làm cho chức năng tĩnh của riêng mình mà sẽ làm những gì ông muốn (một chức năng bản địa của định dạng chuỗi trong đó bao gồm độ chính xác biến). Vì vậy, có và không, bởi vì anh ta đã có các công cụ để làm điều đó. Hoặc ít nhất đó là những gì tôi đang cố gắng làm. – Gerdi

2

Bạn có thể sử dụng lớp DecimalFormat.

double d1 = 3.14159; 
double d2 = 1.235; 

DecimalFormat df = new DecimalFormat("#.##"); 

double roundedD1 = df.format(d); // 3.14 
double roundedD2 = df.format(d); // 1.24 

Nếu bạn muốn thiết lập độ chính xác khi có yêu cầu thời gian chạy:

df.setMaximumFractionDigits(precision)