Câu hỏi nguyên thủy, nhưng làm cách nào để định dạng các chuỗi như thế này:
"Bước {1} trong {2}"
bằng cách thay thế các biến bằng cách sử dụng Java? Trong C # thật dễ dàng.
Câu hỏi nguyên thủy, nhưng làm cách nào để định dạng các chuỗi như thế này:
"Bước {1} trong {2}"
bằng cách thay thế các biến bằng cách sử dụng Java? Trong C # thật dễ dàng.
Câu trả lời:
Ngoài String.format, hãy xem java.text.MessageFormat
. Định dạng ít ngắn gọn hơn và gần hơn một chút với ví dụ C # bạn đã cung cấp và bạn cũng có thể sử dụng nó để phân tích cú pháp.
Ví dụ:
int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));
Một ví dụ đẹp hơn tận dụng các cải tiến của varargs và autoboxing trong Java 1.5 và biến phần trên thành một lớp lót:
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
MessageFormat
là một chút đẹp hơn để làm số nhiều i18nized với công cụ sửa đổi lựa chọn. Để chỉ định một thông báo sử dụng chính xác dạng số ít khi một biến là 1 và số nhiều, nếu không, bạn có thể làm một cái gì đó như thế này:
String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });
MessageFormat.format("Number {0}", 1234));
tùy thuộc vào miền địa phương mặc định có thể tạo ra Number 1,234
thay vì Number 1234
.
{0} it ll take firstname
, khi nào {1} then lastname
, như vậy. Có thể như thế {0,choice,0.getFirstName()}
hay một cái gì đó như thế?
Hãy xem String.format . Tuy nhiên, lưu ý rằng nó cần các bộ định dạng định dạng tương tự như các hàm in của C - ví dụ:
String.format("Hello %s, %d", "world", 42);
Sẽ trở lại "Xin chào thế giới, 42". Bạn có thể thấy điều này hữu ích khi tìm hiểu về các công cụ định dạng. Andy Thomas-Cramer đã tốt bụng khi để lại liên kết này trong một bình luận bên dưới, dường như chỉ ra thông số chính thức. Những cái thường được sử dụng là:
Điều này hoàn toàn khác với C #, sử dụng các tham chiếu vị trí với một công cụ xác định định dạng tùy chọn. Điều đó có nghĩa là bạn không thể làm những việc như:
String.format("The {0} is repeated again: {0}", "word");
... mà không thực sự lặp lại tham số được chuyển sang printf / format. (xem bình luận của Scrum Meister bên dưới)
Nếu bạn chỉ muốn in kết quả trực tiếp, bạn có thể tìm System.out.printf ( PrintStream.printf ) theo ý thích của bạn.
String.format
cũng có thể nhận vị trí số: String.format("%2$s %1$s", "foo", "bar");
sẽ xuấtbar foo
Nếu bạn chọn không sử dụng String.format, tùy chọn khác là toán tử nhị phân +
String str = "Step " + a + " of " + b;
Điều này tương đương với
new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));
Bất cứ điều gì bạn sử dụng là sự lựa chọn của bạn. StringBuilder nhanh hơn, nhưng sự khác biệt về tốc độ là không đáng kể. Tôi thích sử dụng +
toán tử (cái này StringBuilder.append(String.valueOf(X)))
và thấy nó dễ đọc hơn.
+
hoạt động của toán tử. 2) Giải thích của bạn thậm chí không chính xác. +
là tương đương với việc sử dụng StringBuilder
, không String.concat
. (Cách quá nhiều thông tin về điều này.)
Tôi đã viết phương pháp đơn giản của mình cho nó:
public class SomeCommons {
/** Message Format like 'Some String {0} / {1}' with arguments */
public static String msgFormat(String s, Object... args) {
return new MessageFormat(s).format(args);
}
}
vì vậy bạn có thể sử dụng nó như:
SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
public class StringFormat {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("================================");
for(int i=0;i<3;i++){
String s1=sc.next();
int x=sc.nextInt();
System.out.println(String.format("%-15s%03d",s1,x));
}
System.out.println("================================");
}
}
outpot "================================"
ved15space123 ved15space123 ved15space123 "=========== =====================
Giải pháp Java
"-" được sử dụng để thụt lề trái
"15" làm cho độ dài tối thiểu của Chuỗi phải mất là 15
Giải pháp này đã làm việc cho tôi. Tôi cần phải tạo các url cho máy khách REST một cách linh hoạt vì vậy tôi đã tạo phương thức này, vì vậy bạn chỉ cần vượt qua restURL như thế này
/customer/{0}/user/{1}/order
và thêm bao nhiêu thông số bạn cần:
public String createURL (String restURL, Object ... params) {
return new MessageFormat(restURL).format(params);
}
Bạn chỉ cần gọi phương thức này như thế này:
createURL("/customer/{0}/user/{1}/order", 123, 321);
Đầu ra
"/ khách hàng / 123 / người dùng / 321 / đơn hàng"
Tôi đã viết chức năng này nó chỉ làm điều đúng. Nội suy một từ bắt đầu bằng $
giá trị của biến cùng tên.
private static String interpol1(String x){
Field[] ffield = Main.class.getDeclaredFields();
String[] test = x.split(" ") ;
for (String v : test ) {
for ( Field n: ffield ) {
if(v.startsWith("$") && ( n.getName().equals(v.substring(1)) )){
try {
x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
}catch (Exception e){
System.out.println("");
}
}
}
}
return x;
}