views:

668

answers:

7

I'm using MessageFormat to format some addresses with a template like this:

"{0}\n{1}\n{2}\n{3}, {4} {5}"

where

  • 0 = street 1
  • 1 = street 2
  • 2 = street 3
  • 3 = city
  • 4 = state
  • 5 = zip

Most of these fields are optional when captured. How do I avoid having an empty line when for instance, there is not street 3? I could use a template like this "{0}{1}{2}{3}{4}{5}" and then substitute either "street 3\n" or "" accordingly, but then the template doesn't provide much benefit toward formatting.

Is there a way to include conditionals in the format string? Or is there another, preferably lightweight, templating tool available that supports conditional formatting?

+1  A: 

Don't know how lightweight you'd consider it but Apache Velocity is one of the best-known templating engines for Java.

sk
+1  A: 

You could just do the formatting the way you're doing it and then remove blank lines by replacing a run of more than one '\n's with a single '\n', e.g.

result = result.replaceAll("\n+", "\n");
Adam Rosenfield
Nice simple way to solve the question asked - IMHO introducing a template framework just to format an address is a bit overkill.
Nick Pierpoint
A: 

Use Velocity or Freemarker.

+2  A: 

jguru StringTemplates

This was used to build the site jGuru -- it's been around for a while now.

anjanb
+3  A: 

EDIT: rewrite...

If you don't care about design, then you can readily pick a template engine at random, or because you like its name, or whatever. If you don't have criteria for selecting an engine, then who cares which one you pick?

On the other hand, if you do care about design, such as in using the Model-View-Controller (MVC) design pattern, then your choices quickly diminish.

Most of the answers here emphasize the power of the various template engines. But the whole point of MVC is that you don't want to do more, because doing more in your templates will eventually hurt you very bad. Business logic does not belong in the View, it belongs in the Model. Control logic belongs in the controller. There is only one template engine that actually enforces the MVC pattern. If you don't desire the MVC pattern (perhaps you are moving beyond it), that one engine still helps you to not hurt yourself and encourages you to partition your functionality properly.

There is really only one good template engine: StringTemplate. See http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf for details of why.

I have used it on multiple platforms (Python, Java, .Net) as well as many of the alternatives, and StringTemplate rules.

Decision done. Enjoy. Best wishes.

Rob Williams
+1  A: 

Others have mentioned string template, but we recently switched to MVEL (which also does more, but really doesn't add much weight): http://mvel.codehaus.org/ (and I find it easier to use).

Michael Neale
A: 

Freemarker is pretty good. It's light, fast, has conditional formatting, and a tonne of other features.

GaryF