2014-08-28 45 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

相关问题