import java.util.Formattable; import java.util.Formatter; import java.util.Locale; import static java.util.FormattableFlags.ALTERNATE; import static java.util.FormattableFlags.LEFT_JUSTIFY; import static java.util.FormattableFlags.UPPERCASE; public class FormatterTest5 { public static void main(String[] args) { Formatter formatter = new Formatter((Appendable)System.out); Name name = new Name("Yuichi", "Sakuraba"); formatter.format("%%s [%1$s] %%#s [%1$#s]%n", name); formatter.format("%%5s [%1$5s] %%10s [%1$10s]%n", name); formatter.format("%%20s [%1$20s] %%-20s [%1$-20s]%n", name); } } class Name implements Formattable { private String firstName; private String lastName; public Name(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String toString() { return firstName + " " + lastName; } public void formatTo(Formatter formatter, int flags, int width, int precision) { StringBuilder builder = new StringBuilder(); boolean hasLimit = width != -1; if (hasLimit && width < lastName.length()) { createLimittedLastName(builder, width); } else if (hasLimit && width < firstName.length() + lastName.length()) { createLastName(builder); } else { createFullName(builder, flags, formatter.locale()); } // 幅に足りない分のスペースを入れる if (hasLimit && builder.length() < width) { if ((flags & LEFT_JUSTIFY) != LEFT_JUSTIFY) { int num = width - builder.length(); for (int i = 0; i < num; i++) { builder.insert(0, ' '); } } } if ((flags & UPPERCASE) == UPPERCASE) { formatter.format(builder.toString().toUpperCase()); } else { formatter.format(builder.toString()); } } private void createLimittedLastName(StringBuilder builder, int width) { builder.append(lastName.substring(0, width - 1)); builder.append('*'); } private void createLastName(StringBuilder builder) { builder.append(lastName); } private void createFullName(StringBuilder builder, int flags, Locale locale) { if ((flags & ALTERNATE) == ALTERNATE && Character.getType(firstName.charAt(0)) == Character.UPPERCASE_LETTER) { builder.append(firstName.substring(0, 1)); } else { builder.append(firstName); } builder.append(' '); builder.append(lastName); } }