2012-08-26 7 views
22

tôi chắc chắn rằng tôi đã nhìn thấy String.format sử dụng như thế này trước đây:chuỗi định dạng đúng cho String.format hoặc tương tự

String.format("Some {1}, {2}, {3}", var1, var2, var3); 

Liệu chiếc nhẫn này bất kỳ chuông cho bất cứ ai? Có lẽ tôi đang nghĩ đến C#, có cách nào để đạt được điều tương tự trong java không?

Tôi biết bạn có thể làm điều gì đó như:

String.format("Some %s, %d, %s", aString, aNumber, aString) 

nhưng cú pháp tôi sau là dành cho các cựu ...

+0

bạn có thể xin hãy giải thích qustion của bạn một chút? –

Trả lời

30

Điều bạn đang tìm kiếm là MessageFormat, sử dụng định dạng và thông số đầu vào nhất định, ví dụ:

MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3); 

Và như đã đề cập, String.format vẫn có thể thực hiện công việc bằng cách sử dụng cú pháp thay thế, nhưng nó ít mạnh mẽ về tính năng và không phải những gì mà bạn yêu cầu.

+1

Đã thực hiện một số nghiên cứu: String.format thực sự mới hơn MessageFormat. Họ sử dụng các phương pháp khác nhau dưới mui xe nhưng không khác biệt nhiều về chức năng tổng thể. String.format do đó được cho là nhanh hơn. –

+0

Đẹp. Cũng tồn tại trong Android. Một cách định dạng rất đơn giản. Không cần phải cung cấp loại đầu vào là một lợi thế. –

10

Vâng, đó là những điển hình format chuỗi C#. Trong Java, bạn có thể sử dụng sau, tức là, String.format("%s %d %d", ...).

Một thay thế là sử dụng MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3), trong đó sử dụng xoăn NET niềng răng ký hiệu, như đã đề cập bởi @Tobias, mặc dù nó đòi hỏi bạn phải nhập java.text.MessageFormat. Chúng cũng thích hợp hơn khi bạn xử lý các tài nguyên được bản địa hoá, nơi bạn thường có các tệp .properties bên ngoài có thư ở định dạng Error {0} ocurred due to {1}.

3

Tôi không muốn chỉ định cả chỉ mục tham số hoặc loại của thông số - chủ yếu khi ném ngoại lệ và soạn thảo thông báo cho nó. Tôi thích cách SLF4j làm điều đó. Vì vậy, tôi quấn org.slf4j.helpers.MessageFormatter như thế này:

public static String subst(String string, Object...objects) { 
    return MessageFormatter.arrayFormat(string, objects).getMessage(); 
} 

Sau đó, bạn có thể sử dụng nó như thế này:

public void main(String[] args) { 
    throw new RuntimeException(MyUtils.subst("Problem with A={} and B={}!", a, b)); 
}