package org.mapfish.print.map.geotools.grid; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; /** * Formats grid labels. */ public abstract class GridLabelFormat { /** * Create an instance from the given config. * @param param Grid param from the request. */ public static GridLabelFormat fromConfig(final GridParam param) { if (param.labelFormat != null) { return new GridLabelFormat.Simple(param.labelFormat); } else if (param.valueFormat != null) { return new GridLabelFormat.Detailed( param.valueFormat, param.unitFormat, param.formatDecimalSeparator, param.formatGroupingSeparator); } return null; } /** * Format a label using the given value and unit. * @param value Value. * @param unit Unit. */ public abstract String format(final double value, final String unit); /** * Label format where value and unit are formatted at once. */ public static class Simple extends GridLabelFormat { private String labelFormat = null; /** * Constructor. * @param labelFormat Label format. */ public Simple(final String labelFormat) { this.labelFormat = labelFormat; } @Override public final String format(final double value, final String unit) { return String.format(this.labelFormat, value, unit); } } /** * Label format where value and unit are formatted with different patterns. */ public static class Detailed extends GridLabelFormat { private String valueFormat; private String unitFormat; private String formatDecimalSeparator; private String formatGroupingSeparator; /** * Constructor. * @param valueFormat Value format. * @param unitFormat Unit format. * @param formatDecimalSeparator Decimal separator. * @param formatGroupingSeparator Grouping separator. */ public Detailed(final String valueFormat, final String unitFormat, final String formatDecimalSeparator, final String formatGroupingSeparator) { this.valueFormat = valueFormat; this.unitFormat = (unitFormat == null) ? GridParam.DEFAULT_UNIT_FORMAT : unitFormat; this.formatDecimalSeparator = formatDecimalSeparator; this.formatGroupingSeparator = formatGroupingSeparator; } @Override public final String format(final double value, final String unit) { DecimalFormat decimalFormat = null; if (this.formatDecimalSeparator != null || this.formatGroupingSeparator != null) { // if custom separator characters are given, use them to create the format DecimalFormatSymbols symbols = new DecimalFormatSymbols(); if (this.formatDecimalSeparator != null) { symbols.setDecimalSeparator(this.formatDecimalSeparator.charAt(0)); } if (this.formatGroupingSeparator != null) { symbols.setGroupingSeparator(this.formatGroupingSeparator.charAt(0)); } decimalFormat = new DecimalFormat(this.valueFormat, symbols); } else { decimalFormat = new DecimalFormat(this.valueFormat); } return decimalFormat.format(value) + String.format(this.unitFormat, unit); } } }