2009-12-16 56 views
57
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 2 được thêm vào $?

Trả lời

88

Các 2 không có gì để làm với các $:

  • %       =   Bắt đầu chuỗi định dạng
  • 4$   =   lập luận thứ tư ('d')
  • 2       =   chiều rộng của hai (righ t-aligned)
  • s       =   loại Chuỗi
+0

đối số * không thể tạo và chỉnh sửa vì chỉnh sửa quá nhỏ –

35

2$ có nghĩa là đặt đối số thứ hai từ danh sách tại đây. Số $theo sau một số không đứng trước nó. Tương tự, 4$ có nghĩa là đặt đối số thứ nhất tại đây.

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

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

  • 2$ - hiển thị các đố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ị như là một String

Bạn có thể tìm thêm thông tin in the documentation.

+0

Tại sao lại giảm hạng? Đó là một câu trả lời đúng. – Joey

+0

Downvoting chiến thuật? –

+0

Vâng, bây giờ bạn có một chiến thuật upvote, sau đó :-) – Joey

1

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

Định dạng specifiers với nhiều loại được sử dụng để đại diện cho ngày tháng và thời gian có cú pháp sau:

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

Các tùy chọn argument_index là một số nguyên thập phân chỉ ra vị trí của các đố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ằng "2$", v.v.- Formatter documentation

+0

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

1

4 $: đối số giá trị thứ tư %: định dạng chuỗi 2: khoảng cách (chiều dài của đối số) s: một định dạng chuỗi của nó

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); 

công suất:

// khoảng cách của 5 nhân vật giữa hai nhân vật

d   c   b   a 

và thay thế 5 với 2, sẽ cho kết quả sau:

d c b a

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

Các vấn đề liên quan