Как отформатировать десятичные числа с помощью StringTemplate (ST) в Java? - PullRequest
2 голосов
/ 07 июля 2011

Я использую StringTemplate в Java.

Я хотел бы отобразить десятичное число с определенной точностью (например, 3 цифры после десятичной точки).

Возможно ли, чтобы объект ST сделал это?И как?

Редактировать: чтобы уточнить, это особенно актуально при рендеринге объектов.Например, мой код выглядит так:

String renderMe(String template, Collection<MyClass> items)
{
  // render the items here using the template.... 
}

renderMe () не должен ничего знать о полях MyClass, в частности он не должен знать, какие поля являются плавающими точками.Я ищу решение, которое поддерживает эту развязку.

Ответы [ 3 ]

10 голосов
/ 12 июля 2011

Зарегистрируйте встроенный NumberRenderer для подклассов Number, а затем используйте параметр формата:

String template =
    "foo(x,y) ::= << <x; format=\"%,d\"> <y; format=\"%,2.3f\"> >>\n";
STGroup g = new STGroupString(template);
g.registerRenderer(Number.class, new NumberRenderer());
3 голосов
/ 07 июля 2011

Не проверено, но я думаю, что-то вроде этого должно работать:

StringTemplate strTemp = new StringTemplate("Decimal number: $number$");
NumberFormat nf = NumberFormat.getInstance();
((DecimalFormat)nf).applyPattern("0.000");
strTemp.setAttribute("number", nf.format(123.45678));
System.out.println(strTemp);
0 голосов
/ 12 июля 2011

РЕДАКТИРОВАТЬ: глупо меня, ссылка была прямо над той, которую я дал.Используйте рендерер, как в примере, приведенном здесь .

Если вы заранее знаете, какие точности потребуются, вы можете настроить контроллер для обработки этих случаев и вставить их в представление.

Всплеск предложил способ, которым это можно сделать.Несколько более общим способом может быть что-то вроде следующего:

class DoublePrecisionGetters {
  public double number;
  public NumberFormat nf = NumberFormat.getInstance();

  public DoublePrecisionGetters(double d)
  { number = d; }

  public String getTwoPlaces() {
    nf.applyPattern("0.00");
    return nf.format(number);
  }

  public String getThreePlaces() {
    nf.applyPattern("0.000");
    return nf.format(number);
  }

  // etc
}

Вы бы настроили ST как:

ST template = new ST("two places: $number.twoPlaces$", '$');
template.setAttribute("number", new DoublePrecisionGetters(3.14159));

Наконец, если вам действительно нужно, чтобы он был полностью универсальным, вы могли бывзломать что-нибудь вместе с адаптерами модели , зарегистрировав ModelAdaptor для обработки удвоений (или чего-либо еще) и убедившись, что он вычисляет точность на основе запрошенного propertyName.

...