2011-11-16 67 views
11
public class Divers { 
    public static void main(String args[]){ 

    String format = "|%1$-10s|%2$-10s|%3$-20s|\n"; 
    System.out.format(format, "FirstName", "Init.", "LastName"); 
    System.out.format(format, "Real", "", "Gagnon"); 
    System.out.format(format, "John", "D", "Doe"); 

    String ex[] = { "John", "F.", "Kennedy" }; 

    System.out.format(String.format(format, (Object[])ex)); 
    } 
} 

đầu ra:Làm cách nào để căn giữa một chuỗi bằng String.format?

|FirstName |Init.  |LastName   | 
|Real  |   |Gagnon    | 
|John  |D   |Doe     | 
|John  |F.  |Kennedy    | 

Tôi muốn đầu ra được làm trung tâm. Nếu tôi không sử dụng cờ '-', đầu ra sẽ được căn chỉnh về bên phải.

Tôi không tìm thấy cờ để căn giữa văn bản trong API.

This bài viết có một số thông tin về định dạng, nhưng không có gì trên trung tâm biện minh.

+0

Đầu ra thực sự là một bảng, do đó, một số câu hỏi lý do không hiển thị bảng đúng cách. – rana

+3

Xem 'StringUtils' [http://stackoverflow.com/questions/2709993/how-to-center-string-output-using-printf-and-variable-width-java](http://stackoverflow.com/questions/2709993/how-to-center-string-output-using-printf-và-variable-width-java) ** hoặc ** [http://www.java2s.com/Code/Java/Data-Type/CentersaStringinalargerStringofsizesizeusingthespacecharacter .htm] (http://www.java2s.com/Code/Java/Data-Type/CentersaStringinalargerStringofsizesizeusingthespacecharacter.htm) – ecle

+0

@eee là StringUtils trong thư viện chuẩn? – rana

Trả lời

16

Tôi đã nhanh chóng tấn công điều này. Bạn hiện có thể sử dụng StringUtils.center(String s, int size) trong String.format.

import static org.hamcrest.CoreMatchers.*; 
import static org.junit.Assert.assertThat; 

import org.junit.Test; 

public class TestCenter { 
    @Test 
    public void centersString() { 
     assertThat(StringUtils.center(null, 0), equalTo(null)); 
     assertThat(StringUtils.center("foo", 3), is("foo")); 
     assertThat(StringUtils.center("foo", -1), is("foo")); 
     assertThat(StringUtils.center("moon", 10), is(" moon ")); 
     assertThat(StringUtils.center("phone", 14, '*'), is("****phone*****")); 
     assertThat(StringUtils.center("India", 6, '-'), is("India-")); 
     assertThat(StringUtils.center("Eclipse IDE", 21, '*'), is("*****Eclipse IDE*****")); 
    } 

    @Test 
    public void worksWithFormat() { 
     String format = "|%1$-10s|%2$-10s|%3$-20s|\n"; 
     assertThat(String.format(format, StringUtils.center("FirstName", 10), StringUtils.center("Init.", 10), StringUtils.center("LastName", 20)), 
       is("|FirstName | Init. |  LastName  |\n")); 
    } 
} 

class StringUtils { 

    public static String center(String s, int size) { 
     return center(s, size, ' '); 
    } 

    public static String center(String s, int size, char pad) { 
     if (s == null || size <= s.length()) 
      return s; 

     StringBuilder sb = new StringBuilder(size); 
     for (int i = 0; i < (size - s.length())/2; i++) { 
      sb.append(pad); 
     } 
     sb.append(s); 
     while (sb.length() < size) { 
      sb.append(pad); 
     } 
     return sb.toString(); 
    } 
} 
+0

cảm ơn bạn đã trả lời; – rana

+1

Tôi sẽ dính vào StringUtils từ apache commons lang vì nó rất dễ dàng để tích hợp mà sử dụng maven – rana

+0

@ rana, Great Idea! –

4

Đây là câu trả lời bằng cách sử dụng apache commons lang StringUtils.

Xin lưu ý rằng bạn phải thêm tệp jar vào đường dẫn xây dựng. Nếu bạn đang sử dụng maven hãy chắc chắn để thêm commons lang trong phụ thuộc.

import org.apache.commons.lang.StringUtils; 
public class Divers { 
    public static void main(String args[]){ 

    String format = "|%1$-10s|%2$-10s|%3$-20s|\n"; 
    System.out.format(format, "FirstName", "Init.", "LastName"); 
    System.out.format(format,StringUtils.center("Real",10),StringUtils.center("",10),StringUtils.center("Gagnon",20); 

    System.out.format(String.format(format, (Object[])ex)); 
    } 
} 
+1

Câu trả lời này phù hợp hơn, vì sử dụng Thư viện nổi tiếng cho mục đích này –

+1

đã đồng ý @PauloOliveira –

12
public static String center(String text, int len){ 
    String out = String.format("%"+len+"s%s%"+len+"s", "",text,""); 
    float mid = (out.length()/2); 
    float start = mid - (len/2); 
    float end = start + len; 
    return out.substring((int)start, (int)end); 
} 

public static void main(String[] args) throws Exception{ 
    // Test 
    String s = "abcdefghijklmnopqrstuvwxyz"; 
    for (int i = 1; i < 200;i++){ 
     for (int j = 1; j < s.length();j++){ 
      center(s.substring(0, j),i); 
     } 
    } 
} 
+2

Câu trả lời hay! Có thể muốn xem xét việc đặt tên phương thức của bạn là chữ thường, viết hoa làm cho nó có vẻ như nó là một lớp chứ không phải là một phương thức. –

0

Dưới đây là một ví dụ về làm thế nào tôi đã xử lý tập trung các tiêu đề cột trong Java:

public class Test { 
    public static void main(String[] args) { 
     String[] months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", 
       "October", "November", "December" }; 

     // Find length of longest months value. 
     int maxLengthMonth = 0; 
     boolean firstValue = true; 
     for (String month : months) { 
      maxLengthMonth = (firstValue) ? month.length() : Math.max(maxLengthMonth, month.length()); 
      firstValue = false; 
     } 

     // Display months in column header row 
     for (String month : months) { 
      StringBuilder columnHeader = new StringBuilder(month); 
      // Add space to front or back of columnHeader 
      boolean addAtEnd = true; 
      while (columnHeader.length() < maxLengthMonth) { 
       if (addAtEnd) { 
        columnHeader.append(" "); 
        addAtEnd = false; 
       } else { 
        columnHeader.insert(0, " "); 
        addAtEnd = true; 
       } 
      } 
      // Display column header with two extra leading spaces for each 
      // column 
      String format = " %" + Integer.toString(maxLengthMonth) + "s"; 
      System.out.printf(format, columnHeader); 
     } 
     System.out.println(); 

     // Display 10 rows of random numbers 
     for (int i = 0; i < 10; i++) { 
      for (String month : months) { 
       double randomValue = Math.random() * 999999; 
       String format = " %" + Integer.toString(maxLengthMonth) + ".2f"; 
       System.out.printf(format, randomValue); 
      } 
      System.out.println(); 
     } 
    } 
} 
0

Tôi đã chơi xung quanh với câu trả lời tao nhã Mertuarez của trên và quyết định gửi phiên bản của tôi.

public class CenterString { 

    public static String center(String text, int len){ 
     if (len <= text.length()) 
      return text.substring(0, len); 
     int before = (len - text.length())/2; 
     if (before == 0) 
      return String.format("%-" + len + "s", text); 
     int rest = len - before; 
     return String.format("%" + before + "s%-" + rest + "s", "", text); 
    } 

    // Test 
    public static void main(String[] args) { 
     String s = "abcde"; 
     for (int i = 1; i < 10; i++){ 
      int max = Math.min(i, s.length()); 
      for (int j = 1; j <= max; j++){ 
       System.out.println(center(s.substring(0, j), i) + "|"); 
      } 
     } 
    } 
} 

Output:

a| 
a | 
ab| 
a | 
ab | 
abc| 
a | 
ab | 
abc | 
abcd| 
    a | 
ab | 
abc | 
abcd | 
abcde| 
    a | 
    ab | 
abc | 
abcd | 
abcde | 
    a | 
    ab | 
    abc | 
abcd | 
abcde | 
    a | 
    ab | 
    abc | 
    abcd | 
abcde | 
    a | 
    ab | 
    abc | 
    abcd | 
    abcde | 

chênh lệch thực tế từ mã Mertuarez của:

  1. Mine làm toán lên phía trước và làm cho các chuỗi trung tâm cuối cùng trong một shot thay vì làm một too- chuỗi dài và sau đó lấy một chuỗi con từ nó. Tôi cho rằng điều này có hiệu suất cao hơn một chút, nhưng tôi đã không thử nghiệm nó.
  2. Trong trường hợp văn bản không thể được căn giữa hoàn toàn, tôi luôn đặt nó nửa ký tự ở bên trái thay vì đặt nửa ký tự vào nửa bên phải của thời gian.
  3. Trong trường hợp văn bản dài hơn độ dài được chỉ định, tôi luôn trả về một chuỗi con có độ dài được chỉ định bắt nguồn từ đầu văn bản gốc.
Các vấn đề liên quan