/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.server.conversion; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.text.DecimalFormatSymbols; /** * */ public class PercentageValueSignificantFiguresFormatter extends DoubleValueFormatter { /** Formats numbers to five significant figures */ public static final PercentageValueSignificantFiguresFormatter NON_CCY_5SF = PercentageValueSignificantFiguresFormatter.of(5, false); private final BigDecimal _maxValueForSigFig; private final MathContext _sigFigMathContext; public PercentageValueSignificantFiguresFormatter(int significantFigures, boolean isCurrencyAmount) { this(significantFigures, isCurrencyAmount, DecimalFormatSymbols.getInstance()); } public PercentageValueSignificantFiguresFormatter(int significantFigures, boolean isCurrencyAmount, DecimalFormatSymbols formatSymbols) { super(isCurrencyAmount, formatSymbols); _maxValueForSigFig = BigDecimal.TEN.pow(significantFigures - 1); _sigFigMathContext = new MathContext(significantFigures, RoundingMode.HALF_UP); } public static PercentageValueSignificantFiguresFormatter of(int significantFigures, boolean isCurrencyAmount) { return new PercentageValueSignificantFiguresFormatter(significantFigures, isCurrencyAmount); } @Override public BigDecimal process(BigDecimal bigDecimalValue) { if (bigDecimalValue.abs().compareTo(_maxValueForSigFig) > 0) { return bigDecimalValue.setScale(0, RoundingMode.HALF_UP); } else { return bigDecimalValue.round(_sigFigMathContext); } } @Override public String format(BigDecimal value) { BigDecimal processedValue = process(value.multiply(BigDecimal.valueOf(100))); String plainString = super.transformPlainNumberString(processedValue.toPlainString()); return plainString + "%"; } }