Cách định dạng chuỗi trong Java


Câu trả lời:


140

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

MessageFormatlà 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) });

21
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("Number {0}", 1234));tùy thuộc vào miền địa phương mặc định có thể tạo ra Number 1,234thay vì Number 1234.
pavel_kazlou

@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ì đó giống như vậy tôi sẽ vượt qua đối tượng Class có dữ liệu & khi nào {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ế?
dùng3145373

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

Được rồi, tôi đã giới thiệu một dự án .Net như tôi muốn, codeproject.com/Articles/42 310/ , hãy giới thiệu dự án này Tôi đang tìm kiếm như thế này. Nếu bạn biết bất kỳ dự án hoặc gói có sẵn như thế thì xin vui lòng cho tôi biết. Cảm ơn bạn
dùng3145373

232

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à:

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

Đ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.


2
Một tùy chọn khác là java.text.MessageFormat, chấp nhận các ký hiệu định dạng kiểu {1}. Các ký hiệu định dạng của String.format () có thể giống với các ký hiệu định dạng printf () của C - nhưng cũng có thể khác nhau. Xem download.oracle.com/javase/6/docs/api/java/util/ khuyên để biết cú pháp đầy đủ.
Andy Thomas

52
String.formatcũng có thể nhận vị trí số: String.format("%2$s %1$s", "foo", "bar");sẽ xuấtbar foo
Scrum Meister

7

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.


5
Nếu bạn định phủ nhận tôi, xin vui lòng giải thích lý do.
Ryan Amos

11
1) Để trả lời câu hỏi về định dạng chuỗi, bạn giải thích cách +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.)
Søren Løvborg

6

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

5
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

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


1

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"


0

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;
}
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.