[stringtemplate-interest] Problem with fixed-length customobjectrenderer

Rabea Gransberger rgransberger at gmx.de
Thu Feb 26 03:20:12 PST 2009


Or something like this for variable length:

public class TestStringTemplate_FixedLength {
	/** Renders a string by appending with spaces to get a minimal size
*/
	public static class FixesLengthRenderer implements AttributeRenderer
{

		private static final String FORMAT_NAME = "fixedLength";

		public String toString(Object o) {
			return o.toString();
		}

		private String doFormat(Object o, int length) {
			final String s = o.toString();
			if (s.length() == length) {
				return s;
			}
			else if (s.length() > length) {
				return s.substring(0, length);
			}
			else {
				int toAdd = length - s.length();
				return prepend(s, toAdd);
			}
		}

		private String prepend(final String s, int toAdd) {
			char[] c = new char[toAdd];
			Arrays.fill(c, ' ');
			StringBuilder b = new StringBuilder();
			b.append(c);
			b.append(s);
			return b.toString();
		}

		public String toString(Object o, String formatName) {
			if (formatName.startsWith(FORMAT_NAME)) {
				final String strgLength =
formatName.substring(FORMAT_NAME
						.length());
				try {
					int length =
Integer.parseInt(strgLength);
					return doFormat(o, length);
				}
				catch (NumberFormatException e) {
					e.printStackTrace();
					return toString(o);
				}

			}
			return toString(o);
		}
	}

	public static void main(String[] args) {
		StringTemplate st = new StringTemplate(
				"$elems:{$it;format=\"fixedLength5\"$ foo};
separator=\"\n\"$");
		st.registerRenderer(String.class, new
FixesLengthRenderer());
		st.setAttribute("elems", new String[] { "ABC", "DEFG" });
		System.out.println(st.toString());
	}
}



More information about the stringtemplate-interest mailing list