2014-08-28 108 views
0

我想在兩行中打印兩個字符串(中文字符)。在字符串中放置可變寬度字體的空間佔位符,java

String1="XXXX"+"詞語:" 
String2="YY"+"詞語:" 

我想「詞語:」將對齊。因此,如果需要,我需要爲String添加一些空格。

如何以靈活的方式格式化此字符串(我知道XXXX的最大長度)。 我想我可以使用String.format(),但我找不到正確的佔位符。

更新時間:

我把一些問題的答案,並發現該解決方案是不是在Eclipse控制檯爲中國工作:

String english1="xxxx"; 
    String english2="yy"; 

    String chinese1="臥臥臥"; 
    String chinese2="臥"; 
    int n=english1.length()>english2.length()? english1.length():english2.length(); 
    int m=chinese1.length()>chinese2.length()? chinese1.length():chinese2.length(); 

    System.out.println("n="+n); 
    System.out.println("m="+m); 

    System.out.println(padRight(english1,n)+"end"); 
    System.out.println(padRight(english2,n)+"end"); 
    System.out.println("----------------------------"); 
    System.out.println(padRight(chinese1,m)+"end"); 
    System.out.println(padRight(chinese2,m)+"end"); 

輸出:

n=4 
m=3 
xxxxend 
    yyend 
---------------------------- 
臥臥臥end 
    臥end 

中國的填充仍然有問題,謝謝!

回答

0

嘗試使用這種方法

public static String padLeft(String s, int n) { 
    return String.format("%1$-" + n + "s", s); 
} 

看到http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax

特別:[精度]

%[的argument_index $] [標誌] [寬度]轉換

+0

我會嘗試,現在,你會不會也解釋「%1 $」+ n是什麼意思? – Jaskey 2014-08-28 04:32:26

+0

小心我編輯它'return String.format(「%1 $ - 」+ n +「s」,s); ' – 2014-08-28 04:33:05

+0

我想你是對的但是我試着通過這個詞和n = 8,它不起作用。 n是什麼意思? – Jaskey 2014-08-28 04:40:01

3

類似...

System.out.println(String.format("%-4s %s:", "XXXX", "詞語")); 
System.out.println(String.format("%-4s %s:", "YY", "詞語")); 

它打印

XXXX 詞語: 
YY 詞語: 

或者

System.out.println(String.format("%4s %s:", "XXXX", "詞語")); 
System.out.println(String.format("%4s %s:", "YY", "詞語")); 

它打印

XXXX 詞語: 
    YY 詞語: 

然後,您可以把這個包成一個方法調用,並通過前綴和後綴對爲你做格式

例如...

public class Test1 { 

    public static void main(String[] args) { 
     System.out.println(formatLeftAligned("XXXX", "詞語")); 
     System.out.println(formatLeftAligned("YY", "詞語")); 

     System.out.println(formatRightAligned("XXXX", "詞語")); 
     System.out.println(formatRightAligned("YY", "詞語")); 

    } 

    public static String formatLeftAligned(String prefix, String suffix) { 
     return String.format("%-4s %s:", prefix, suffix); 
    } 

    public static String formatRightAligned(String prefix, String suffix) { 
     return String.format("%4s %s:", prefix, suffix); 
    } 

} 

或者

public class Test1 { 

    public static void main(String[] args) { 
     System.out.println(formatLeftAligned("XXXX", 4, "詞語")); 
     System.out.println(formatLeftAligned("YY", 4, "詞語")); 

     System.out.println(formatRightAligned("XXXX", 4, "詞語")); 
     System.out.println(formatRightAligned("YY", 4, "詞語")); 

    } 

    public static String formatLeftAligned(String prefix, int padding, String suffix) { 
     return String.format("%-" + padding + "s %s:", prefix, suffix); 
    } 

    public static String formatRightAligned(String prefix, int padding, String suffix) { 
     return String.format("%" + padding + "s %s:", prefix, sufix); 
    } 

} 

如果你想在填充更多的控制...你甚至可以使用可變參數的方法使該格式的方法來確定填充量它的自我,並返回格式化這些要求String秒的陣列,作爲一種思想

更新

如果同時需要後綴和前綴,來填充,它可能更容易墊他們分開,例如...

public class Test1 { 

    public static void main(String[] args) { 

     System.out.println(String.format("%s %s:", padLeft("XXXX", 4), padLeft("??", 2))); 
     System.out.println(String.format("%s %s:", padRight("XXXX", 4), padRight("??", 2))); 
     System.out.println(String.format("%s %s:", padLeft("XXXX", 4), padRight("??", 2))); 
     System.out.println(String.format("%s %s:", padRight("XXXX", 4), padLeft("??", 2))); 

     System.out.println(String.format("%s %s:", padLeft("YY", 4), padLeft("??", 2))); 
     System.out.println(String.format("%s %s:", padRight("YY", 4), padRight("??", 2))); 
     System.out.println(String.format("%s %s:", padLeft("YY", 4), padRight("??", 2))); 
     System.out.println(String.format("%s %s:", padRight("YY", 4), padLeft("??", 2))); 

     System.out.println(String.format("%s %s:", padLeft("XXXX", 4), padLeft("?", 2))); 
     System.out.println(String.format("%s %s:", padRight("XXXX", 4), padRight("?", 2))); 
     System.out.println(String.format("%s %s:", padLeft("XXXX", 4), padRight("?", 2))); 
     System.out.println(String.format("%s %s:", padRight("XXXX", 4), padLeft("?", 2))); 

     System.out.println(String.format("%s %s:", padLeft("YY", 4), padLeft("?", 2))); 
     System.out.println(String.format("%s %s:", padRight("YY", 4), padRight("?", 2))); 
     System.out.println(String.format("%s %s:", padLeft("YY", 4), padRight("?", 2))); 
     System.out.println(String.format("%s %s:", padRight("YY", 4), padLeft("?", 2))); 

    } 

    public static String padLeft(String value, int padding) { 
     return String.format("%-" + padding + "s", value); 
    } 

    public static String padRight(String value, int padding) { 
     return String.format("%" + padding + "s", value); 
    } 
} 

不要忘記你可以複合格式...

XXXX 詞語: 
XXXX 詞語: 
XXXX 詞語: 
XXXX 詞語: 
YY 詞語: 
    YY 詞語: 
YY 詞語: 
    YY 詞語: 
XXXX 人 : 
XXXX 人: 
XXXX 人: 
XXXX 人 : 
YY 人 : 
    YY 人: 
YY 人: 
    YY 人 : 

更新

關注每一個格式化的需要separatly,例如....

System.out.println(String.format("%s=\"%s\"", padLeft("XXXX", 4), "詞語")); 
System.out.println(String.format("%s=\"%s\"", padLeft("YY", 4), "人")); 

在這裏,我們從什麼它顯示格式化 「XXXX」 和 「YY」 分開,這個打印...

XXXX="詞語" 
YY ="人" 

更新

字體在這方面發揮了非常大的作用,例如...

FontWidth

正如你所看到的,中國文字擴大超出了「正常」的字符寬度,而事實上,每個中國人性格有它自己的寬度......

更新

如果你使用的鞦韆,你利用它的內置HTML(有限)的支持,例如

StringBuilder sb = new StringBuilder(128); 
sb.append("<html><table><tr><td align=left>"); 
sb.append("詞語"); 
sb.append("</td><td align=left>"); 
sb.append("end"); 
sb.append("</td></tr><tr><td align=left>"); 
sb.append("人"); 
sb.append("</td><td align=left>"); 
sb.append("end"); 
sb.append("</td></tr></table>"); 
JOptionPane.showMessageDialog(null, sb); 

FontWidth OptionPane

+0

嗨,如果我希望最大長度(這兩個字符串的較大長度)是一個參數呢?我可以把-4換成「 - 」+ n嗎? – Jaskey 2014-08-28 04:41:37

+0

@Jaskey是啊,起初沒有想到,但我更新了包括一個變量填充值 – MadProgrammer 2014-08-28 04:42:58

+0

謝謝!我測試了一下,如果XXX是英文的話,它就可以工作,但是當我使用XXXX =「臥底」,YYYY =「人」時,它沒有正確地使用..請問你試試嗎? – Jaskey 2014-08-28 05:12:04

0

比你@ MadProgrammer的答案,是英語填充工作的罰款。我選擇它的一部分。

下面是結果測試:

public static void main(String[] args){ 
    String english1="xxxx"; 
    String english2="yy"; 

    String chinese1="臥底的"; 
    String chinese2="人"; 

    int n=english1.length()>english2.length()? english1.length():english2.length(); 
    int m=chinese1.length()>chinese2.length()? chinese1.length():chinese2.length(); 
    System.out.println(padRight(english1,n)+"end"); 
    System.out.println(padRight(english2,n)+"end"); 
    System.out.println(padRight(chinese1,m)+"end"); 
    System.out.println(padRight(chinese2,m)+"end"); 
} 

public static String padRight(String value, int padding) { 
     return String.format("%" + padding + "s", value); 
} 

輸出是:

xxxxend 
    yyend 
臥底的end 
    人end 

注意,宋劍南,中國填充,仍然有一些問題

+0

正如Scary Wombat指出的那樣,你需要一個固定寬度的字體來正確顯示這個顯示...... – MadProgrammer 2014-08-28 06:06:45

+0

@MadProgrammer那麼,這個寬度應該是多少?以及代碼如何改變? – Jaskey 2014-08-28 06:07:23

+0

寬度是(半)不相關。你需要一個字體,每個字符是相同的大小(寬度) - 因此,固定寬度的字體 – MadProgrammer 2014-08-28 06:10:08

相關問題