package jnpf.elnFormula; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public final class FormulaFunctionRegistry { private final Map functions; private final List catalog; private final List codes; public FormulaFunctionRegistry() { LinkedHashMap values = new LinkedHashMap<>(); add(values, "ABS", "绝对值", "数学", "ABS(x)", "返回数值的绝对值", "ABS(-2)"); add(values, "POW", "幂", "数学", "POW(x, n)", "返回 x 的整数次幂", "POW(2, 3)"); add(values, "SQRT", "平方根", "数学", "SQRT(x)", "返回非负数的平方根", "SQRT(4)"); add(values, "MIN", "最小值", "数学", "MIN(x, ...)", "返回参数中的最小值", "MIN(1, 2)"); add(values, "MAX", "最大值", "数学", "MAX(x, ...)", "返回参数中的最大值", "MAX(1, 2)"); add(values, "IF", "条件", "逻辑", "IF(condition, trueValue, falseValue)", "按条件返回一个分支", "IF(true, 1, 0)"); add(values, "COALESCE", "首个非空值", "逻辑", "COALESCE(value, ...)", "返回首个非 NULL 值", "COALESCE(null, 1)"); add(values, "IS_BLANK", "判空", "逻辑", "IS_BLANK(value)", "判断 NULL、空白文本或空列表", "IS_BLANK(null)"); add(values, "SUM", "求和", "统计", "SUM(values)", "返回数值列表之和", "SUM(values_a1)"); add(values, "MEAN", "平均值", "统计", "MEAN(values)", "返回数值列表平均值", "MEAN(values_a1)"); add(values, "STDDEV_S", "样本标准差", "统计", "STDDEV_S(values)", "返回数值列表的样本标准差", "STDDEV_S(values_a1)"); add(values, "RSD", "相对标准偏差", "统计", "RSD(values)", "返回百分比相对标准偏差", "RSD(values_a1)"); add(values, "ROUND", "四舍五入", "修约", "ROUND(x, scale)", "按 HALF_UP 模式修约", "ROUND(2.345, 2)"); add(values, "ROUND_UP", "远离零修约", "修约", "ROUND_UP(x, scale)", "按 UP 模式修约", "ROUND_UP(2.341, 2)"); add(values, "ROUND_DOWN", "向零修约", "修约", "ROUND_DOWN(x, scale)", "按 DOWN 模式修约", "ROUND_DOWN(2.349, 2)"); add(values, "CONVERT", "单位换算", "单位", "CONVERT(value, from, to)", "在同维度质量或体积单位间换算", "CONVERT(1000, \"mg\", \"g\")"); add(values, "LOOKUP_EXACT", "精确查值", "查值", "LOOKUP_EXACT(key, x1, y1, ...)", "按数值键精确查找", "LOOKUP_EXACT(2, 1, 10, 2, 20)"); add(values, "LOOKUP_LINEAR", "线性插值", "查值", "LOOKUP_LINEAR(key, x1, y1, ...)", "在严格递增点间线性插值", "LOOKUP_LINEAR(5, 0, 0, 10, 1)"); add(values, "LN", "自然对数", "数学", "LN(x)", "返回 x 的自然对数", "LN(10)"); add(values, "LOG10", "常用对数", "数学", "LOG10(x)", "返回 x 以 10 为底的对数", "LOG10(100)"); add(values, "LOG", "指定底数对数", "数学", "LOG(x, base)", "返回 x 以 base 为底的对数", "LOG(8, 2)"); add(values, "EXP", "自然指数", "数学", "EXP(x)", "返回 e 的 x 次幂", "EXP(1)"); add(values, "NTH_ROOT", "N 次方根", "数学", "NTH_ROOT(x, n)", "返回 x 的 n 次方根", "NTH_ROOT(27, 3)"); add(values, "COUNT", "计数", "统计", "COUNT(values)", "返回数值列表的项数", "COUNT(values_a1)"); add(values, "MEDIAN", "中位数", "统计", "MEDIAN(values)", "返回数值列表的中位数", "MEDIAN(values_a1)"); add(values, "STDDEV_P", "总体标准差", "统计", "STDDEV_P(values)", "返回数值列表的总体标准差", "STDDEV_P(values_a1)"); add(values, "VAR_S", "样本方差", "统计", "VAR_S(values)", "返回数值列表的样本方差", "VAR_S(values_a1)"); add(values, "VAR_P", "总体方差", "统计", "VAR_P(values)", "返回数值列表的总体方差", "VAR_P(values_a1)"); add(values, "GEOMEAN", "几何平均值", "统计", "GEOMEAN(values)", "返回非负数值列表的几何平均值", "GEOMEAN(values_a1)"); add(values, "WEIGHTED_MEAN", "加权平均值", "统计", "WEIGHTED_MEAN(values, weights)", "按非负权重计算加权平均值", "WEIGHTED_MEAN(values_a1, weights_b2)"); add(values, "SLOPE", "线性回归斜率", "校准", "SLOPE(xValues, yValues)", "返回最小二乘直线斜率", "SLOPE(x_values_a1, y_values_b2)"); add(values, "INTERCEPT", "线性回归截距", "校准", "INTERCEPT(xValues, yValues)", "返回最小二乘直线截距", "INTERCEPT(x_values_a1, y_values_b2)"); add(values, "CORREL", "相关系数", "校准", "CORREL(xValues, yValues)", "返回 Pearson 相关系数", "CORREL(x_values_a1, y_values_b2)"); add(values, "LINEAR_PREDICT", "线性预测", "校准", "LINEAR_PREDICT(x, xValues, yValues)", "按最小二乘直线返回预测值", "LINEAR_PREDICT(5, x_values_a1, y_values_b2)"); add(values, "ROUND_HALF_EVEN", "四舍六入五成双", "修约", "ROUND_HALF_EVEN(x, scale)", "按 HALF_EVEN 模式修约中间结果", "ROUND_HALF_EVEN(2.345, 2)"); add(values, "ROUND_SIG", "有效数字修约", "修约", "ROUND_SIG(x, digits)", "按 HALF_UP 模式保留有效数字", "ROUND_SIG(12345, 3)"); add(values, "ROUND_SIG_HALF_EVEN", "有效数字五成双修约", "修约", "ROUND_SIG_HALF_EVEN(x, digits)", "按 HALF_EVEN 模式保留有效数字", "ROUND_SIG_HALF_EVEN(1.245, 3)"); functions = Collections.unmodifiableMap(values); catalog = Collections.unmodifiableList(new ArrayList<>(values.values())); codes = Collections.unmodifiableList(new ArrayList<>(values.keySet())); } public FormulaFunction get(String code) { return functions.get(code); } public boolean contains(String code) { return functions.containsKey(code); } public List catalog() { return catalog; } public List codes() { return codes; } private static void add(Map functions, String code, String chineseName, String category, String signature, String description, String example) { functions.put(code, new FormulaFunction(code, chineseName, category, signature, description, example, returnType(code))); } private static String returnType(String code) { if ("IF".equals(code) || "COALESCE".equals(code)) { return "DYNAMIC"; } return "IS_BLANK".equals(code) ? "BOOLEAN" : "DECIMAL"; } }