在String,java中为可变宽度的字体放置空格的持有者

时间:2014-08-28 04:27:53

标签: java string string-formatting placeholder

我想在两行中打印两个String(中文字符)。

String1="XXXX"+"词语:"
String2="YY"+"词语:"

我希望“词语:”会对齐。所以如果需要,我需要在左边添加一些空格用于String。

如何以灵活的方式格式化此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

中文填充还有问题,谢谢!

3 个答案:

答案 0 :(得分: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);
    }

}

如果你想要更多地控制填充...你甚至可以使用varargs方法允许格式方法确定它自己的填充量,并返回格式化为这些要求的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 人 :

<强>更新

分别关注每个格式需求,例如....

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

在这里,我们格式化&#34; XXXX&#34;和&#34; YY&#34;与它的显示分开,这打印......

XXXX="词语"
YY  ="人"

<强>更新

字体在这方面起着非常重要的作用,例如......

FontWidth

正如您所看到的,中文字符超出了正常情况&#34;字符宽度,事实上,每个汉字都有自己的宽度......

<强>更新

如果你正在使用Swing,你可以利用它对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

答案 1 :(得分: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] [标志] [宽度] [精度]换算

答案 2 :(得分: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

请注意,冲洗垫仍有问题