Java Aligning Strings
ProblemYou want to align strings to the left, right, or center.
Solution
Do the math yourself, and use substring (Recipe 3.1) and a StringBuilder (Recipe 3.3). Or, just use my StringAlign class, which is based on the java.text.Format class.
Explained
Centering and aligning text comes up surprisingly often. Suppose you want to print a simple report with centered page numbers. There doesn’t seem to be anything in the standard API that will do the job fully for you. But I have written a class called StringAlign that will. Here’s how you might use it:
/* Align a page number on a 70-character line. */ public class StringAlignSimple { public static void main(String[] args) { // Construct a "formatter" to center strings. StringAlign formatter = new StringAlign(70, StringAlign.JUST_CENTER); // Try it out, for page "i" System.out.println(formatter.format("- i -")); // Try it out, for page 4. Since this formatter is // optimized for Strings, not specifically for page numbers, // we have to convert the number to a String System.out.println(formatter.format(Integer.toString(4))); } }
If we compile and run this class, it prints the two demonstration line numbers centered,
as shown:
> jikes +E -d . StringAlignSimple.java > java StringAlignSimple - i - 4 >
The code for the StringAlign class. Note that this class extends a class
called Format. In the package java.text, there is a series of Format classes that all have
at least one method called format( ). It is thus in a family with numerous other formatters,
such as DateFormat, NumberFormat, and others, that we’ll meet in upcoming
chapters.
StringAlign.java /** Bare-minimum String formatter (string aligner). */ public class StringAlign extends Format { /* Constant for left justification. */ public static final int JUST_LEFT = 'l'; /* Constant for centering. */ public static final int JUST_CENTRE = 'c'; /* Centering Constant, for those who spell "centre" the American way. */ public static final int JUST_CENTER = JUST_CENTRE; /** Constant for right-justified Strings. */ public static final int JUST_RIGHT = 'r'; /** Current justification */ private int just; /** Current max length */ private int maxChars; /** Construct a StringAlign formatter; length and alignment are * passed to the Constructor instead of each format( ) call as the * expected common use is in repetitive formatting e.g., page numbers. * @param nChars - the length of the output * @param just - one of JUST_LEFT, JUST_CENTRE or JUST_RIGHT */ public StringAlign(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; } /** Format a String. * @param input _ the string to be aligned * @parm where - the StringBuffer to append it to. * @param ignore - a FieldPosition (may be null, not used but * specified by the general contract of Format). */ public StringBuffer format( Object obj, StringBuffer where, FieldPosition ignore) { String s = (String)obj; String wanted = s.substring(0, Math.min(s.length( ), maxChars)); // Get the spaces in the right place. 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); // Adjust for "rounding error" 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(' '); } /** Convenience Routine */ String format(String s) { return format(s, new StringBuffer( ), null).toString( ); } /** ParseObject is required, but not useful here. */ public Object parseObject (String source, ParsePosition pos) { return source; } }
No comments:
Post a Comment