Java Aligning Strings - Supercoders | Web Development and Design | Tutorial for Java, PHP, HTML, Javascript Java Aligning Strings - Supercoders | Web Development and Design | Tutorial for Java, PHP, HTML, Javascript

Breaking

Post Top Ad

Post Top Ad

Thursday, December 27, 2018

Java Aligning Strings

Java Aligning Strings

Problem

You 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

Post Top Ad