package fr.openwide.core.wicket.more.rendering; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; import javax.annotation.Nonnull; import com.google.common.base.Function; import com.google.common.base.Functions; import fr.openwide.core.commons.util.functional.SerializableFunction; public final class CoreRenderers { private static Function<Locale, DecimalFormat> percentDecimalFormatFunction(final String pattern, final RoundingMode roundingMode) { return new SerializableFunction<Locale, DecimalFormat>() { private static final long serialVersionUID = 1L; @Override public DecimalFormat apply(@Nonnull Locale input) { DecimalFormat df = new DecimalFormat(pattern, new DecimalFormatSymbols(input)); df.setRoundingMode(roundingMode); df.setMultiplier(100); return df; } }; } private static final Function<Locale, DecimalFormat> PERCENT_FORMAT_FUNCTION = percentDecimalFormatFunction("#0.00\u00A0'%'", RoundingMode.HALF_UP); private static final Function<Locale, DecimalFormat> PERCENT_NO_SIGN_FORMAT_FUNCTION = percentDecimalFormatFunction("#0.00\u00A0", RoundingMode.HALF_UP); private static final Renderer<BigDecimal> PERCENT = Renderer.<BigDecimal>fromNumberFormat(PERCENT_FORMAT_FUNCTION); private static final Renderer<BigDecimal> PERCENT_NO_SIGN = Renderer.<BigDecimal>fromNumberFormat(PERCENT_NO_SIGN_FORMAT_FUNCTION); private static final Function<DecimalFormat, DecimalFormat> TO_RELATIVE_FORMAT_FUNCTION = new SerializableFunction<DecimalFormat, DecimalFormat>() { private static final long serialVersionUID = 1L; @Override public DecimalFormat apply(@Nonnull DecimalFormat input) { input.setPositivePrefix("+"); input.setNegativePrefix("-"); return input; } }; private static final Renderer<BigDecimal> PERCENT_RELATIVE = Renderer.<BigDecimal>fromNumberFormat(Functions.compose(TO_RELATIVE_FORMAT_FUNCTION, PERCENT_FORMAT_FUNCTION)); private CoreRenderers() { } public static Renderer<BigDecimal> percent(String pattern, RoundingMode roundingMode) { return Renderer.<BigDecimal>fromNumberFormat(percentDecimalFormatFunction(pattern, roundingMode)); } public static Renderer<BigDecimal> percent() { return PERCENT; } public static Renderer<BigDecimal> percentNoSign() { return PERCENT_NO_SIGN; } public static Renderer<BigDecimal> percentRelative() { return PERCENT_RELATIVE; } }