2011-06-21 47 views
96

câu hỏi nguyên thủy, nhưng làm cách nào để định dạng chuỗi như thế này:Làm thế nào để định dạng chuỗi trong Java

"Bước {1} của {2}"

bởi các biến thay thế sử dụng Java? Trong C# thật dễ dàng.

+0

Xem [Câu hỏi này] (http://stackoverflow.com/questions/5057960/is-there-a-general-string-substitution-function -similar-to-sl4fj) –

+0

http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax –

Trả lời

80

Ngoài String.format, cũng có một cái nhìn java.text.MessageFormat. Định dạng ít ngắn gọn và một chút gần gũi hơn với C# Ví dụ bạn' đã cung cấp và bạn có thể sử dụng nó cho phân tích cú pháp cũng

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 varargs và cải tiến autoboxing trong Java 1.5 và biến trên vào một lớp lót:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar"); 

MessageFormat đẹp hơn một chút khi thực hiện số nhiều i18nized với công cụ sửa đổi lựa chọn.Để xác định một thông điệp rằng một cách chính xác sử dụng dưới hình thức số ít khi một biến là 1 và số nhiều trường hợp, 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) }); 
+6

MessageFormat dành cho mục đích bản địa hóa, vì vậy hãy cẩn thận khi sử dụng nó. Ví dụ, đoạn mã sau 'MessageFormat.format (" Số {0} ", 1234));' tùy thuộc vào miền địa phương mặc định có thể tạo 'Số 1,234' thay vì' Số 1234'. –

+0

@ataylor: Xin chào, Xin lỗi nhưng tôi hơi bối rối. Tôi muốn một cái gì đó như thế tôi sẽ vượt qua đối tượng Class có dữ liệu và khi '{0} nó sẽ lấy firstname', khi' {1} sau đó lastname', như vậy. Có thể như '{0, choice, 0.getFirstName()}' hay một cái gì đó như thế không? –

+0

@ user3145373 ツ Tôi không nghĩ vậy. – ataylor

133

Hãy xem String.format. Tuy nhiên, lưu ý rằng phải có định dạng thông số tương tự như các định dạng của họ printf chức năng của C - ví dụ:

String.format("Hello %s, %d", "world", 42); 

Sẽ trả về "Hello world 42". Bạn có thể tìm thấy this hữu ích khi tìm hiểu về các định dạng thông số. Andy Thomas-Cramer đã tử tế để rời khỏi liên kết this trong một bình luận bên dưới, có vẻ như chỉ ra thông số chính thức. Những cái phổ biến nhất được sử dụng là:

  • % s - chèn một chuỗi
  • % d - chèn một số nguyên ký (thập phân)
  • % f - chèn một số thực, ký hiệu chuẩn

Điều này hoàn toàn khác với C#, sử dụng tham chiếu vị trí với một định dạng tùy chọn định dạng. Điều đó có nghĩa rằng 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 đi lặp lại các tham số truyền cho printf/định dạng. (xem bình luận Các Scrum Meister của 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 thấy System.out.printf (PrintStream.printf) theo ý thích của bạn.

+2

Một tùy chọn khác là java.text.MessageFormat, nó chấp nhận { 1} biểu tượng định dạng kiểu. Các ký hiệu định dạng của String.format() có thể tương tự như các ký hiệu định dạng printf() của C - nhưng cũng có thể khác nhau. Xem http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax để biết cú pháp đầy đủ. –

+27

'String.format' cũng có thể lấy các vị trí số:' String.format ("% 2 $ s% 1 $ s", "foo", "bar"); 'sẽ xuất' thanh foo' –

2

Nếu bạn chọn không sử dụng String.format, tùy chọn khác là + nhị phân điều hành

String str = "Step " + a + " of " + b; 

Đây là tương đương với

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

Cho dù bạn sử dụng là sự lựa chọn của bạn. StringBuilder là nhanh hơn, nhưng sự khác biệt tốc độ là biên. Tôi thích sử dụng các nhà điều hành + (mà hiện một StringBuilder.append(String.valueOf(X))) và tìm thấy nó dễ dàng hơn để đọc.

+2

Nếu bạn đang đi để neg rep tôi, xin vui lòng giải thích lý do tại sao. –

+7

1) Để trả lời câu hỏi về định dạng chuỗi, bạn giải thích cách toán tử '+' hoạt động. 2) Giải thích của bạn thậm chí không chính xác. '+' tương đương với việc sử dụng 'StringBuilder', không phải' String.concat'. [(Cách quá nhiều thông tin về điều này.)] (Http: //www.znetdevelopment.com/blogs/2009/04/06/java-string-concatenation /) –

+2

StringBuilder.append, trên thực tế. Tôi sẽ cập nhật câu trả lời. –

2
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 " ================= ===============

Java giải pháp

  • Các "-" được dùng để thụt lề trái

  • Các "15" làm cho chiều dài tối thiểu của chuỗi nó chiếm được 15

  • Các "s" (đó là một vài ký tự sau%) sẽ được thay thế bởi Chuỗi của chúng tôi
  • 0 số nguyên của chúng tôi bằng 0 ở bên trái
  • Số 3 làm cho số nguyên của chúng tôi có chiều dài tối thiểu là 3
+0

Bạn đúng http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax –

2

Tôi đã viết phương pháp đơn giản của tôi 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); 
    } 
} 

để bạn có thể sử dụng nó như:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two"); 
1

Giải pháp này làm việc cho tôi. Tôi cần thiết để tạo ra các url cho một khách hàng REST của động vì vậy tôi tạo ra phương pháp này, vì vậy bạn chỉ phải vượt qua restURL như thế này

/customer/{0}/user/{1}/order 

và thêm bao nhiêu params như 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ư sau:

createURL("/customer/{0}/user/{1}/order", 123, 321); 

sản lượng

"/ khách hàng/123/người dùng/321/đơn đặt hàng"

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