Browse Source

untested support for FormatNumber

git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1217 f203690c-595d-4dc9-a70b-905162fa7fd2
tags/jackcess-2.2.1
James Ahlborn 5 years ago
parent
commit
47de466737

+ 62
- 0
src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctions.java View File

@@ -18,6 +18,7 @@ package com.healthmarketscience.jackcess.impl.expr;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
@@ -278,6 +279,42 @@ public class DefaultFunctions
}
});

public static final Function FORMATNUMBER = registerFunc(new FuncVar("FormatNumber", 1, 6) {
@Override
protected Value evalVar(EvalContext ctx, Value[] params) {
Value param1 = params[0];
if(param1.isNull()) {
return ValueSupport.NULL_VAL;
}

int numDecDigits = getOptionalIntParam(ctx, params, 1, 2, -1);
boolean incLeadDigit = getOptionalTriStateBoolean(ctx, params, 2, true);
boolean negParens = getOptionalTriStateBoolean(ctx, params, 3, false);
boolean groupDigits = getOptionalTriStateBoolean(ctx, params, 4, true);

StringBuilder fmt = new StringBuilder();

fmt.append(incLeadDigit ? "0" : "#");
if(numDecDigits > 0) {
fmt.append(".");
for(int i = 0; i < numDecDigits; ++i) {
fmt.append("0");
}
}

if(negParens) {
fmt.append(";(#)");
}

// Note, DecimalFormat rounding mode uses HALF_EVEN by default
DecimalFormat df = new DecimalFormat(
fmt.toString(), ctx.getNumericConfig().getDecimalFormatSymbols());
df.setGroupingUsed(groupDigits);

return ValueSupport.toValue(df.format(param1.getAsBigDecimal(ctx)));
}
});

public static final Function VARTYPE = registerFunc(new Func1("VarType") {
@Override
protected Value eval1(EvalContext ctx, Value param1) {
@@ -417,6 +454,31 @@ public class DefaultFunctions
return false;
}

private static boolean getOptionalTriStateBoolean(
EvalContext ctx, Value[] params, int idx, boolean defValue) {
boolean bv = defValue;
if(params.length > idx) {
int val = params[idx].getAsLongInt(ctx);
switch(val) {
case 0:
// vbFalse
bv = false;
break;
case -1:
// vbTrue
bv = true;
break;
case -2:
// vbUseDefault
bv = defValue;
break;
default:
throw new EvalException("Unsupported tri-state boolean value " + val);
}
}
return bv;
}

// https://www.techonthenet.com/access/functions/
// https://support.office.com/en-us/article/Access-Functions-by-category-b8b136c3-2716-4d39-94a2-658ce330ed83


Loading…
Cancel
Save