package org.jtwig.functions.impl.string;
import org.jtwig.functions.FunctionRequest;
import org.jtwig.functions.SimpleJtwigFunction;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import static org.jtwig.util.FunctionValueUtils.getNumber;
import static org.jtwig.util.FunctionValueUtils.getString;
public class NumberFormatFunction extends SimpleJtwigFunction {
@Override
public String name() {
return "number_format";
}
@Override
public Object execute(FunctionRequest request) {
request.minimumNumberOfArguments(1).maximumNumberOfArguments(4);
Object number = getNumber(request, 0);
switch (request.getNumberOfArguments()) {
case 2:
return numberFormat(number, getNumber(request, 1), null, null);
case 3:
return numberFormat(number, getNumber(request, 1), getString(request, 2), null);
case 4:
return numberFormat(number, getNumber(request, 1), getString(request, 2), getString(request, 3));
default:
return numberFormat(number, null, null, null);
}
}
private String numberFormat (Object numberArg, BigDecimal fractionDigits, String decimalSeparator, String groupingSeparator) {
Object number = (numberArg == null) ? 0 : numberArg;
DecimalFormat numberFormat = new DecimalFormat();
DecimalFormatSymbols decimalFormatSymbols = numberFormat.getDecimalFormatSymbols();
if (fractionDigits != null) {
numberFormat.setMaximumFractionDigits(fractionDigits.intValue());
numberFormat.setMinimumFractionDigits(fractionDigits.intValue());
}
if (decimalSeparator != null && !decimalSeparator.isEmpty())
decimalFormatSymbols.setDecimalSeparator(decimalSeparator.charAt(0));
else
decimalFormatSymbols.setDecimalSeparator('.');
if (groupingSeparator != null && !groupingSeparator.isEmpty())
decimalFormatSymbols.setGroupingSeparator(groupingSeparator.charAt(0));
else
numberFormat.setGroupingUsed(false);
numberFormat.setDecimalFormatSymbols(decimalFormatSymbols);
return numberFormat.format(number);
}
}