Hiểu các chuỗi định dạng $ trong Java


84
 StringBuilder sb = new StringBuilder();
 // Send all output to the Appendable object sb
 Formatter formatter = new Formatter(sb, Locale.US);

 // Explicit argument indices may be used to re-order output.
 formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
 // -> " d  c  b  a"

Trong trường hợp này, tại sao số 2 được thêm vào $?

Câu trả lời:


132

Không 2liên quan gì đến $:

  • %     = Bắt đầu chuỗi định dạng
  • 4$   = Đối số thứ tư ('d')
  • 2     = chiều rộng của hai (căn phải)
  • s     = loại chuỗi

Đó thực sự giải thích rõ ràng cảm ơn. Tuy nhiên, khi tôi sử dụng% 4 $ 2s và giá trị đối số của tôi là 'ABCDEFGH', nó không chỉ truy xuất 2 ký tự. Nó đã truy xuất chuỗi đầy đủ. Tại sao?
kandarp

49

Phương 2$tiện đặt đối số thứ hai từ danh sách ở đây. Số $ sau không đứng trước nó. Tương tự,4$ có nghĩa là đặt lập luận ở đây.

Để làm rõ, chúng ta có thể chia %2$2sđịnh dạng thành các phần của nó:

  • % - cho biết đây là một chuỗi định dạng

  • 2$ - cho thấy đối số giá trị thứ hai nên được đặt ở đây

  • 2 - định dạng dài hai ký tự

  • s - định dạng giá trị dưới dạng chuỗi

Bạn có thể tìm thêm thông tin trong tài liệu .


Nó thực sự đã bị phản đối, khi đó là một câu trả lời sai. Vì nó là chính xác bây giờ, downvote đã bị xóa.
Sven Lilienthal

1
@Sven - Câu trả lời không bao giờ thay đổi, tôi nghĩ chắc bạn đã đọc nhầm. Tôi đã thêm vào nhưng không thay đổi bất kỳ nội dung nào.
Dave Webb

Chà, khi tôi bỏ phiếu thì nó đọc: "2 $ nghĩa là đặt đối số thứ hai từ danh sách ở đây." Đó không phải là những gì tôi sẽ tính là một câu trả lời đúng.
Sven Lilienthal

Nó vẫn nói chính xác điều đó bây giờ và bạn đã nói nó chính xác.
Dave Webb 17/12/09

Về bản thân, nó sai hoặc ít nhất là không trả lời câu hỏi, nhưng đặt vào ngữ cảnh, nó đúng.
Sven Lilienthal

4

Đó là các đối số vị trí trong đó các %4$2stín hiệu để định dạng đối số thứ tư là một chuỗi có chiều rộng 2. Điều này đặc biệt hữu ích khi cung cấp các chuỗi để bản địa hóa nơi các đối số cần được sắp xếp lại mà không cần chạm vào mã nguồn.

Các chỉ định định dạng cho các loại được sử dụng để biểu thị ngày và giờ có cú pháp sau:

%[argument_index$][flags][width]conversion

Tùy chọn argument_indexlà một số nguyên thập phân cho biết vị trí của đối số trong danh sách đối số. Đối số đầu tiên được tham chiếu bởi "1$", đối số thứ hai bởi "2$", v.v. - Tài liệu định dạng


Tuy nhiên, tôi thích các chuỗi định dạng của .NET tốt hơn vì chúng làm cho vị trí của các đối số rõ ràng hơn nhiều.
Joey

4

%: chuỗi định dạng

4$: đối số giá trị thứ tư

2: width (chiều dài khi đối số được in)

s: đó là một chuyển đổi đối số chuỗi

ví dụ: đoạn mã sau:

StringBuffer sb=new StringBuffer();

Formatter formatter=new Formatter(sb,Locale.UK);

formatter.format("-%4$5s-%3$5s-%2$5s-%1$5s-", "a", "b", "c", "d");

System.out.println(sb);

tạo ra đầu ra là:

-    d-    c-    b-    a-

(độ rộng 5 ký tự cho mỗi đối số, được đệm bằng dấu cách)

và thay thế 5bằng 2, sẽ tạo ra kết quả sau:

- d- c- b- a-

Thấy sự khác biệt? :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.