package com.xuan.string; import java.text.FieldPosition; import java.text.Format; import java.text.ParsePosition; import javax.management.MXBean; /*实现字符串的对齐,袖珍字符串格式化器(字符串对齐)*/ public class StringAlign006 extends Format{ /*用于左对齐的常量*/ public static final int JUST_LEFT='1'; /*用于居中的常量*/ public static final int JUST_CENTRE='c'; /*居中常量(内饰英语拼写为“centre”)*/ public static final int JUST_CENTER=JUST_CENTRE; /*用于右对齐的常量*/ public static final int JUST_RIGHT='r'; /*当前的对齐*/ private int just; /*当前最大的行宽(以字符为单位)*/ private int maxChars; /*构造一个名为StringAlign的字符串格式化器。字符串长度与对齐格式被传递给构造方法, 而不是每个format()调用,原因是这种即将通用的做法是在反复格式化,例如,页码 @param nChars:输出字符串的长度 @param just-JUST_LEFT JUST_LEFTJUST_RIGHT */ public StringAlign006 (int maxChars,int just){ switch(just){ case JUST_LEFT: case JUST_CENTRE: case JUST_RIGHT: this.just=just; break; default: throw new IllegalArgumentException("invalid justification arg."); } if(maxChars<0){ throw new IllegalArgumentException("maxChars must be positive."); } this.maxChars=maxChars; } /*格式化字符串 * @param input-将被对齐的字符串 * @param where-用于追加的字符串缓冲区StringBuffer * @param ignore FieldPosition (可能为空,但一般由Format的约定来指定) * * */ public StringBuffer format(Object obj,StringBuffer where,FieldPosition ignore){ String s=(String)obj; String wanted=s.substring(0,Math.min(s.length(),maxChars)); //如果没有空间用于对齐,则返回最大行宽(maxChars)的内容 if(wanted.length()>maxChars){ where.append(wanted); } //否则可以得到右边空间的空格数 else switch(just){ case JUST_RIGHT: pad(where,maxChars-wanted.length()); where.append(wanted); break; case JUST_CENTRE: int startPos=where.length(); pad(where,(maxChars-wanted.length())/2); where.append(wanted); pad(where,(maxChars-wanted.length())/2); //调整“化整误差” pad(where,maxChars-(where.length()-startPos)); break; case JUST_LEFT: where.append(wanted); pad(where,maxChars-wanted.length()); break; } return where; } protected final void pad(StringBuffer to,int howMany){ for (int i = 0; i < howMany; i++) { to.append(' '); } } /*子程序*/ String format(String s){ return format(s,new StringBuffer(),null).toString(); } /*ParseObject 是必须的,但是在这里比不过没有多大用处*/ public Object parseObject(String source,ParsePosition pos){ return source; } /*测试*/ public static void main(String[] args) { //构造一个格式化器("formatter")用于字符串居中 StringAlign006 formatter=new StringAlign006(70, StringAlign006.JUST_CENTER); //浏览第“i”页 System.out.println(formatter.format("-i-")); //测试第4页。由于这个格式化器是针对字符串的,而不是处理 //页号(int型)的,因而,需要将数字转化成字符串 System.out.println(formatter.format(Integer.toString(4))); } }