(7)StringAlign文本对齐

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)));
	}
			
}

你可能感兴趣的:((7)StringAlign文本对齐)