GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - toolgood/ToolGood.Algorithm: ToolGood.Algorithm is a powerful, lightweight, Excel formula compatible algorithm library aimed at improving developers’ productivity in different business scenes. ToolGood.Algorithm是一个功能强大、轻量级、兼容Excel公式的算法类库,旨在提高开发人员在不同业务场景中的生产力。

BranchesTags
Open more actions menu

Latest commit

 

History

1,799 Commits
1,799 Commits

Folders and files

NameName
Last commit message
Last commit date
HtmlEditor
HtmlEditor
 
 
JavaScript.Fast
JavaScript.Fast
 
 
JavaScript
JavaScript
 
 
JavaScript2
JavaScript2
 
 
cpp
cpp
 
 
csharp
csharp
 
 
g4
g4
 
 
go
go
 
 
java
java
 
 
python
python
 
 
tools
tools
 
 
.gitignore
.gitignore
 
 
README-EN.md
README-EN.md
 
 
README.md
README.md
 
 
license.md
license.md
 
 

Repository files navigation

ToolGood.Algorithm

English document

ToolGood.Algorithm是一个功能强大、轻量级、兼容Excel公式的算法类库,旨在提高开发人员在不同业务场景中的生产力。

注:ToolGood.Algorithm主要以Decimal为基础,Decimal精度高,不代表没有误差,速度较double慢。

适用场景: 代码与算法分离,避免项目强制升级

1)项目初期,未确定的算法;

2)项目维护时,经常改动的算法,不想硬编码的代码;

3)财务数据、统计数据之中的算法,(注:Decimal精度高,也有误差,建议使用分为单位);

快速上手

    AlgorithmEngine engine = new AlgorithmEngine();

    // 编译并执行公式
    var fn = engine.Parse("1+2");
    var o = engine.Evaluate(fn);
    double a = o.DoubleValue; // Return: 3 返回:3

    var b = engine.TryEvaluate("1=1 && 1<2 || 7-8>1", 0);// Support(支持) && || 
    var c = engine.TryEvaluate("2+3", 0);
    var q = engine.TryEvaluate("-7 < -2 ?1 : 2", 0);
    var e = engine.TryEvaluate("count(array(1, 2, 3, 4))", 0);//{} represents array, return: 4 {}代表数组, 返回:4
    var s = engine.TryEvaluate("'aa'&'bb'", ""); //String connection, return: aabb 字符串连接, 返回:aabb
    var r = engine.TryEvaluate("(1=1)*9+2", 0); //Return: 11 返回:11
    var d = engine.TryEvaluate("'2016-1-1'+1", DateTime.MinValue); //Return date: 2016-1-2 返回日期:2016-1-2
    var j = engine.TryEvaluate("json('{\"Name\":\"William Shakespeare\", \"Age\":51, \"Birthday\":\"04/26/1564 00:00:00\"}').Age", null);//Return 51 返回51
    var k = engine.TryEvaluate("json('{\"Name\":\"William Shakespeare   \", \"Age\":51, \"Birthday\":\"04/26/1564 00:00:00\"}')['Name'].Trim()", null);//Return "William Shakespeare"  返回"William Shakespeare" (不带空格)
    var l = engine.TryEvaluate("json('{\"Name1\":\"William Shakespeare \", \"Age\":51, \"Birthday\":\"04/26/1564 00:00:00\"}')['Name'& 1].Trim().substring(2, 3)", null);//Return "ill"  返回"ill"
    var n = engine.TryEvaluate("{Name:\"William Shakespeare\", Age:51, Birthday:\"04/26/1564 00:00:00\"}.Age", null);//Return 51 返回51
    var m = engine.TryEvaluate("[1,2,3,4,5,6].has(13)", true);//Return false 返回false

支持常量true, false。

数值转bool,非零为真, 零为假。字符串转bool, 0、FALSE、NO、无、没有、不是、否为假,1、TRUE、YES、是、有为真。不区分大小写。

bool转数值,假为0,真为1。bool转字符串,假为FALSE,真为TRUE。

索引默认为Excel索引,如果想用c#索引,请设置UseExcelIndex为false。

中文符号自动转成英文符号:括号, 逗号, 引号, 双引号,加,减,乘,除,等号。

注:字符串拼接使用&。

注:find为Excel公式,find(要查找的字符串, 被查找的字符串[, 开始位置])

注:6.0版本开始,[X,X]数组代码替换{X,X}。

注:6.2版本开始,禁止时间转数字,数字转时间,时间加减乘除数字,相关操作使用函数代替。

自定义参数

    //Define cylinder information  定义圆柱信息 
    public class Cylinder : AlgorithmEngine
    {
        private int _radius;
        private int _height;
        public Cylinder(int radius, int height)
        {
            _radius = radius;
            _height = height;
        }

        protected override Operand GetParameter(string parameter)
        {
            if (parameter == "半径")
            {
                return Operand.Create(_radius);
            }
            if (parameter == "直径")
            {
                return Operand.Create(_radius * 2);
            }
            if (parameter == "高")
            {
                return Operand.Create(_height);
            }
            return base.GetParameter(parameter);
        }
    }
    //Call method  调用方法
    Cylinder c = new Cylinder(3, 10);
    c.TryEvaluate("半径*半径*pi()", 0.0);      //Round bottom area  圆底面积
    c.TryEvaluate("直径*pi()", 0.0);            //The length of the circle  圆的周长
    c.TryEvaluate("半径*半径*pi()*高", 0.0); //Volume of circle 圆的体积
    c.TryEvaluate("'圆-'&半径&'-'&高", ""); // Return: 圆-3-10

参数定义参数名,

注:不支持5.9版本以下 [参数名],【参数名】,#参数名#,@参数名。

注:AlgorithmEngineEx 可以使用AddParameter、AddParameterFromJson添加参数。

注:可以重写GetParameter、ExecuteDiyFunction方法,来自定义参数和自定义方法。

注:使用 AlgorithmEngineHelper.GetDiyNames 获取参数名、自定义方法名。

辅助方法

    // DiyNameInfo 位于 ToolGood.Algorithm.Internals 命名空间
    DiyNameInfo p5 = AlgorithmEngineHelper.GetDiyNames("ddd(d1, 22)");
    Assert.AreEqual("ddd", p5.Functions[0].Name);
    Assert.AreEqual("d1", p5.Parameters[0].Name);

支持单位

可设置标准单位:长度DistanceUnit(默认:m)、面积AreaUnit(默认:m2)、体积VolumeUnit(默认:m3)、重量MassUnit(默认:kg)。

注:公式计算时,先将带单位的数量转成标准单位,再进行数字计算。

    AlgorithmEngine engine = new AlgorithmEngine();
    bool a = engine.TryEvaluate("1=1m", false); // return true
    bool b = engine.TryEvaluate("1=1m2", false); // return true
    bool c = engine.TryEvaluate("1=1m3", false); // return true
    bool d = engine.TryEvaluate("1=1kg", false); // return true

    // 单位转化
    var num = AlgorithmEngineHelper.UnitConversion(1M,"米","千米"); 

    // 不抛错例子
    bool error = engine.TryEvaluate("1m=1m2", false); // return true

计算逻辑引擎

CalculationLogicEngine 用于构建可追溯的多步骤计算流程:通过初始化值、检查条件、公式赋值、设置值等步骤逐步计算,并自动输出完整的计算过程信息,便于审计、调试与流程跟踪。

using ToolGood.Algorithm.CalculationLogic;

var logic = new CalculationLogicEngine(new FunctionCache(), useCalculationLogicInfo: true);

logic.SetSceneName("折扣计算");                      // 设置场景名称
logic.InitValue("price", 100M);                     // 初始化值
logic.InitValue("count", 3M);

if (logic.CheckCondition("count>=3", 1)) {          // 检查条件(支持层级)
    logic.SetFormula("total", "price*count*0.8", 0, "满3件打8折");   // 用公式赋值
} else {
    logic.SetFormula("total", "price*count", 0); 
}

Console.WriteLine(logic.ToInfoString());
// 输出:
// [初始] price=100;count=3;
// ===== 折扣计算 =====
// [成功]    if count>=3: // 3>=3
// [赋值] total = price*count*0.8 = 100*3*0.8 = 240 // 满3件打8折

注:

  • InitValue:初始化参数值,支持 string / decimal / double / bool / int / DateTime;
  • CheckCondition:执行条件判断,返回 bool,条件必须是布尔值,否则抛出 FormatException;
  • SetFormula:用公式计算结果并赋值,公式中可引用已定义的参数;
  • SetValue:直接设置参数值,支持 string / decimal / double / bool / int / DateTime;
  • GetValue:获取参数值,返回 Operand;
  • BlankLine:在输出信息中添加空行;
  • SetSceneName:设置场景名称;
  • InitValue、CheckCondition、SetFormula、SetValue 均提供可选的 layer、remark 参数:layer 控制输出缩进深度,remark 在输出中追加 // 备注(InitValue 的 layer、remark 不影响输出);
  • 构造参数 useCalculationLogicInfo 为 false 时,关闭过程信息记录,ToInfoString() 返回空字符串。
  • 推荐赋值方法SetFormula、SetValue的layer 为 0,审核时,我们主要看的赋值过程,而不是 CheckCondition 的过程。

Excel公式

函数:逻辑函数、数学与三角函数、文本函数、统计函数、日期与时间函数

注:函数名不分大小写, 带方括号的参数可省略, 示例的返回值, 为近似值。

注2:函数名带★,表示第一个参数可以前置,如(-1).ISTEXT()

注3:函数名带▲,表示受Excel索引影响,

注4:json数组索引也受Excel索引影响,如[1,2,3][1]在Excel索引模式下返回第一个元素1,在C#索引模式下返回第二个元素2。

逻辑函数

函数名说明示例
IFif(测试条件, 真值[, 假值])
执行真假值判断, 根据逻辑计算的真假值, 返回不同结果。
if(1=1, 1, 2)
>>1
IFSifs(条件1, 值1, 条件2, 值2, ...)
检查是否满足一个或多个条件, 且返回第一个TRUE条件对应的值。
IFS(1=1, 'a', 1=2, 'b')
>>a
SWITCHswitch(表达式, 值1, 结果1, 值2, 结果2, ...)
根据值列表计算表达式的值, 并返回对应结果。
SWITCH(1, 1, 'one', 2, 'two')
>>one
ifErrorifError(测试条件, 真值[, 假值])
如果公式计算出错误则返回您指定的值;否则返回公式结果。
ifError(1/0, 1, 2)
>>1
isError ★ isError(值)
判断是否出错, 返回 TRUE 或 FALSE isError(值, 替换值)
如果出错, 返回替换值,否则返回原值
isError(1)
>>false
isNull ★ isNull(值)
判断是否为空, 返回 TRUE 或 FALSE isNull(值, 替换值)
如果为空, 返回替换值,否则返回原值
isNull(null)
>>true
isNullOrError ★ isNullOrError(值)
判断是否为空或错误, 返回 TRUE 或 FALSE isNullOrError(值, 替换值)
如果为空或错误, 返回替换值,否则返回原值
isNullOrError(null)
>>true
isNumber ★isNumber(值)
判断是否数值, 返回 TRUE 或 FALSE
isNumber(1)
>>true
isText ★isText(值)
判断是否文字, 返回 TRUE 或 FALSE
isText('1')
>>true
IsNonText ★IsNonText(值)
判断是否为非文字, 返回 TRUE 或 FALSE
IsNonText('1')
>>false
IsLogical ★IsLogical(值)
判断是否为逻辑值, 返回 TRUE 或 FALSE
IsLogical('1')
>>false
IsEven ★IsEven(值)
如果数值是偶数, 返回 TRUE 或 FALSE
IsEven('1')
>>false
IsOdd ★IsOdd(值)
如果数值是奇数, 返回 TRUE 或 FALSE
IsOdd('1')
>>true
ANDand(逻辑值1, ...)
如果所有参数均为TRUE, 则返回TRUE, 如有错误先报错
and(1, 2=2)
>>true
ORor(逻辑值1, ...)
如果任一参数为TRUE, 则返回TRUE, 如有错误先报错
or(1, 2=3)
>>true
XORxor(逻辑值1, ...)
返回所有参数的异或值, 奇数个TRUE返回TRUE
xor(true(), false())
>>true
NOTnot(逻辑值)
对参数的逻辑值求反
NOT(true())
>>false
TRUEtrue()
返回逻辑值TRUE
true()
>>true
FALSEfalse()
返回逻辑值FALSE
false()
>>false

数学与三角函数

分类函数名说明示例
基

础

数

学
Ee()
返回 e 值
E()
>>
PIpi()
返回 PI 值
pi()
>>3.141592654
absabs(数值)
返回数值的绝对值
abs(-1)
>>1
QUOTIENTquotient(被除数, 除数)
返回商的整数部分, 该函数可用于舍掉商的小数部分。
QUOTIENT(7, 3)
>>2
modmod(被除数, 除数)
返回两数相除的余数
MOD(7, 3)
>>1
SIGNsign(数值)
返回数值的符号。当数值为正数时返回 1, 为零时返回 0, 为负数时返回 -1。
SIGN(-9)
>>-1
SQRTsqrt(数值)
返回正平方根
SQRT(9)
>>3
TRUNCtrunc(数值)
将数值截尾取整
TRUNC(9.222)
>>9
int ★int(数值)
将数值向下舍入到最接近的整数。
int(9.222)
>>9
gcdgcd(数值, ...)
返回最大公约数
GCD(3, 5, 7)
>>1
LCMlcm(数值, ...)
返回整数参数的最小公倍数
LCM(3, 5, 7)
>>105
combincombin(总数, 选取数)
计算从给定数目的对象集合中提取若干对象的组合数
combin(10, 2)
>>45
PERMUTpermut(总数, 选取数)
返回从给定数目的对象集合中选取的若干对象的排列数
PERMUT(10, 2)
>>90
FIXEDfixed(数值[, 小数位数[, 有无逗号分隔符]])
将数值设置为具有固定小数位的文本格式
FIXED(4567.89, 1)
>>4,567.9
三

角

函

数
degreesdegrees(弧度)
将弧度转换为度
degrees(pi())
>>180
RADIANSradians(度)
将度转换为弧度
RADIANS(180)
>>3.141592654
coscos(弧度)
返回数值的余弦值
cos(1)
>>0.540302305868
coshcosh(弧度)
返回数值的双曲余弦值
cosh(1)
>>1.54308063481
SINsin(弧度)
返回给定角度的正弦值
sin(1)
>>0.84147098480
SINHsinh(弧度)
返回数值的双曲正弦值
sinh(1)
>>1.1752011936
TANtan(弧度)
返回数值的正切值
tan(1)
>>1.55740772465
TANHtanh(弧度)
返回数值的双曲正切值
tanh(1)
>>0.761594155955
acosacos(数值)
返回数值的反余弦值
acos(0.5)
>>1.04719755119
acoshacosh(数值)
返回数值的反双曲余弦值
acosh(1.5)
>>0.962423650119
asinasin(数值)
返回数值的反正弦值
asin(0.5)
>>0.523598775598
asinhasinh(数值)
返回数值的反双曲正弦值。
asinh(1.5)
>>1.1947632172
atanatan(数值)
返回数值的反正切值
atan(1)
>>0.785398163397
atanhatanh(数值)
返回参数的反双曲正切值
atanh(0.5)
>>0.549306144334
atan2atan2(x坐标, y坐标)
从X和Y坐标返回反正切
atan2(1, 2)
>>1.10714871779
COTcot(弧度)
返回数值的余切值
cot(1)
>>0.64209261593
COTHcoth(弧度)
返回数值的双曲余切值
coth(1)
>>1.31303528549
CSCcsc(弧度)
返回数值的余割值
csc(1)
>>1.18839510578
CSCHcsch(弧度)
返回数值的双曲余割值
csch(1)
>>0.85091812823
SECsec(弧度)
返回数值的正割值
sec(1)
>>1.85081571768
SECHsech(弧度)
返回数值的双曲正割值
sech(1)
>>0.64805427366
ACOTacot(数值)
返回数值的反余切值
acot(1)
>>0.78539816339
ACOTHacoth(数值)
返回数值的反双曲余切值
acoth(2)
>>0.54930614433
四

舍

五

入
ROUNDround(数值, 小数位数)
返回某个数值按指定位数取整后的数值。
ROUND(4.333, 2)
>>4.33
roundDownroundDown(数值, 小数位数)
靠近零值, 向下(绝对值减小的方向)舍入数值。
roundDown(4.333, 2)
>>4.33
roundUproundUp(数值, 小数位数)
远离零值, 向上(绝对值增长的方向)舍入数值。
roundUp(4.333, 2)
>>4.34
CEILING
CEIL
ceiling(数值, 舍入基数)
向上舍入(沿绝对值增大的方向)为最接近的 舍入基数 的倍数。
CEILING(4.333, 0.1)
>>4.4
floorfloor(数值, 舍入基数)
向下舍入, 使其等于最接近的 Significance 的倍数。
FLOOR(4.333, 0.1)
>>4.3
eveneven(数值)
返回沿绝对值增大方向取整后最接近的偶数。
EVEN(3)
>>4
ODDodd(数值)
将数值向上舍入为最接近的奇数整数
ODD(3.1)
>>5
MROUNDmround(数值, 舍入基数)
返回一个舍入到所需倍数的数值
MROUND(13, 5)
>>15
随

机

数
RANDrand()
返回 0 到 1 之间的随机数
RAND()
>>0.2
randBetweenrandBetween(最小整数, 最大整数)
返回大于等于指定的最小值, 小于指定最大值之间的一个随机整数。
randBetween(2, 44)
>>9
幂

/

对

数

/

阶

乘
factfact(数值)
返回数的阶乘, 一个数的阶乘等于 1*2*3*…* 该数。
FACT(3)
>>6
factdoublefactDouble(数值)
返回数值的双倍阶乘
factDouble(10)
>>3840
POWERpower(数值, 幂)
返回数的乘幂结果
POWER(10, 2)
>>100
expexp(幂)
返回e的指定数乘幂
exp(2)
>>7.389056099
lnln(数值)
返回数值的自然对数
LN(4)
>>1.386294361
loglog(数值[, 底数])
返回数值的常用对数, 如省略底数, 默认为10
LOG(100, 10)
>>2
LOG10log10(数值)
返回数值以10为底的对数
LOG10(100)
>>2
MULTINOMIALmultinomial(数值, ...)
返回参数和的阶乘与各参数阶乘乘积的比值
MULTINOMIAL(1, 2, 3)
>>60
PRODUCTproduct(数值, ...)
将所有以参数形式给出的数值相乘, 并返回乘积值。
PRODUCT(1, 2, 3, 4)
>>24
SqrtPiSqrtPi(数值)
返回某数与 PI 的乘积的平方根
SqrtPi(3)
>>3.069980124
ERFerf(数值)
返回误差函数值
ERF(1)
>>0.842701
ERFCerfc(数值)
返回补余误差函数值
ERFC(1)
>>0.157299
BESSELIbesselI(x, n)
返回修正贝塞尔函数 In(x)
BESSELI(1.5, 1)
>>0.981666
BESSELJbesselJ(x, n)
返回贝塞尔函数 Jn(x)
BESSELJ(1.5, 1)
>>0.557937
BESSELKbesselK(x, n)
返回修正贝塞尔函数 Kn(x)
BESSELK(1.5, 1)
>>0.277388
BESSELYbesselY(x, n)
返回贝塞尔函数 Yn(x)
BESSELY(1.5, 1)
>>-0.412309
DELTAdelta(数值1[, 数值2])
检验两个数值是否相等, 相等返回1, 否则返回0
DELTA(5, 5)
>>1
GESTEPgestep(数值[, 阈值])
检验数值是否大于等于阈值, 大于等于返回1, 否则返回0
GESTEP(5, 4)
>>1
SUMSQsumSq(数值, ...)
返回参数的平方和
SUMSQ(1, 2)
>>5
SUMPRODUCTsumproduct(数组1, 数组2, ...)
返回数组对应元素乘积之和
SUMPRODUCT(array(1, 2, 3), array(4, 5, 6))
>>32
SUMX2MY2sumx2my2(数组X, 数组Y)
返回两数组中对应数值的平方差之和
SUMX2MY2(array(1, 2, 3), array(4, 5, 6))
>>-63
SUMX2PY2sumx2py2(数组X, 数组Y)
返回两数组中对应数值的平方和之和
SUMX2PY2(array(1, 2, 3), array(4, 5, 6))
>>91
SUMXMY2sumxmy2(数组X, 数组Y)
返回两数组中对应数值之差的平方和
SUMXMY2(array(1, 2, 3), array(4, 5, 6))
>>27
SERIESSUMseriessum(X, N, M, 系数数组)
返回幂级数之和
SERIESSUM(2, 0, 1, array(1, 1, 1, 1))
>>15
ARABIC ★arabic(罗马数字文本)
将罗马数字转换为阿拉伯数字
ARABIC('MMXXIII')
>>2023
ROMAN ★roman(数值[, 类型])
将阿拉伯数字转换为罗马数字
ROMAN(2023)
>>MMXXIII
转

化
DEC2BIN ★DEC2BIN(数值[, 位数])
十进制转二进制
DEC2BIN(100)
>>
DEC2OCT ★DEC2OCT(数值[, 位数])
十进制转八进制
DEC2OCT(100)
>>
DEC2HEX ★DEC2HEX(数值[, 位数])
十进制转十六进制
DEC2HEX(100)
>>
HEX2BIN ★HEX2BIN(数值[, 位数])
十六进制转二进制
HEX2BIN(100)
>>
HEX2OCT ★HEX2OCT(数值[, 位数])
十六进制转八进制
HEX2OCT(100)
>>
HEX2DEC ★HEX2DEC(数值)
十六进制转十进制
HEX2DEC(100)
>>
OCT2BIN ★OCT2BIN(数值[, 位数])
八进制转二进制
OCT2BIN(100)
>>
OCT2DEC ★OCT2DEC(数值)
八进制转十进制
OCT2DEC(100)
>>
OCT2HEX ★OCT2HEX(数值[, 位数])
八进制转十六进制
OCT2HEX(100)
>>
BIN2OCT ★BIN2OCT(数值[, 位数])
二进制转八进制
BIN2OCT(100)
>>
BIN2DEC ★BIN2DEC(数值)
二进制转十进制
BIN2DEC(100)
>>
BIN2HEX ★BIN2HEX(数值[, 位数])
二进制转十六进制
BIN2HEX(100)
>>

文本函数

函数名说明示例
ASC ★asc(字符串)
将字符串内的全角英文字母更改为半角字符
asc('abcABC123')
>>abcABC123
JIS ★
WIDECHAR ★
jis(字符串)
将字符串中的半角英文字符更改为全角字符
jis('abcABC123')
>>abcABC123
CHAR ★CHAR(数值)
返回由代码数值指定的字符
char(49)
>>1
CLEAN ★clean(字符串)
删除文本中所有打印不出的字符
clean('\r112\t')
>>112
CODE ★code(字符串)
返回文本字符串中第一个字符的数值代码
CODE("1")
>>49
CONCATENATE ★concatenate(字符串1, ...)
将若干文本项合并到一个文本项中
CONCATENATE('tt', '11')
>>tt11
EXACT ★exact(字符串1, 字符串2)
检查两个文本值是否完全相同
EXACT("11", "22")
>>false
FIND ★ ▲find(要查找的字符串, 被查找的字符串[, 开始位置])
在一文本值内查找另一文本值(区分大小写)
FIND("11", "12221122")
>>5
LEFT ★left(字符串[, 字符个数])
返回文本值最左边的字符
LEFT('123222', 3)
>>123
LEN ★len(字符串)
返回文本字符串中的字符个数
LEN('123222')
>>6
MID ★ ▲mid(字符串, 开始位置, 字符个数)
从文本字符串中的指定位置起返回特定个数的字符
MID('ABCDEF', 2, 3)
>>BCD
PROPER ★proper(字符串)
将文本值中每一个单词的首字母设置为大写
PROPER('abc abc')
>>Abc Abc
REPLACE ★ ▲ replace(原字符串, 开始位置, 字符个数, 新字符串)
replace(原字符串, 要替换的字符串, 新字符串)
替换文本内的字符
REPLACE("abccd", 2, 3, "2")
>>a2d
REPLACE("abccd", "bc", "2")
>>a2cd
REPT ★rept(字符串, 重复次数)
按给定次数重复文本
REPT("q", 3)
>>qqq
RIGHT ★right(字符串[, 字符个数])
返回文本值最右边的字符
RIGHT("123q", 3)
>>23q
RMB ★RMB(数值)
将数值转换为大写金额文本
RMB(12.3)
>>壹拾贰元叁角
SEARCH ★ ▲search(要找的字符串, 被查找的字符串[, 开始位置])
在一文本值中查找另一文本值(不区分大小写)
SEARCH("aa", "abbAaddd")
>>4
SUBSTITUTE ★substitute(字符串, 原字符串, 新字符串[, 替换序号])
在文本字符串中以新文本替换旧文本
SUBSTITUTE("ababcc", "ab", "12")
>>1212cc
T ★t(数值)
将参数转换为文本
T('123')
>>123
TEXT ★text(数值, 数值格式)
设置数值的格式并将数值转换为文本
TEXT(123, "0.00")
>>123.00
TRIM ★trim(字符串)
删除文本中的空格
TRIM(" 123 123 ")
>>123 123
LOWER ★
TOLOWER ★
lower(字符串)
tolower(字符串)
将文本转换为小写形式
LOWER('ABC')
>>abc
UPPER ★
TOUPPER ★
upper(字符串)
toupper(字符串)
将文本转换为大写形式
UPPER("abc")
>>ABC
VALUE ★value(字符串)
将文本参数转换为数值
VALUE("123")
>>123
UNICHAR ★unichar(数值)
返回由Unicode数值指定的字符
unichar(65)
>>A
UNICODE ★unicode(字符串)
返回文本字符串中第一个字符的Unicode数值代码
UNICODE("A")
>>65

日期与时间函数

函数名说明示例
NOWnow()
返回当前日期和时间的序列号
NOW()
>>2017-01-07 11:00:00
TODAYtoday()
返回今天日期的序列号
TODAY()
>>2017-01-07
DateValue ★DateValue(字符串)
将文本格式的日期转换为序列号
DateValue("2017-01-02")
>>2017-01-02
TimeValue ★TimeValue(字符串)
将文本格式的时间转换为序列号
TimeValue("12:12:12")
>>12:12:12
DATE ★date(年, 月, 日[, 时[, 分[, 秒]]])
返回特定日期的序列号
DATE(2016, 1, 1)
>>2016-01-01
TIME ★time(时, 分, 秒)
返回特定时间的序列号
TIME(12, 13, 14)
>>12:13:14
YEAR ★year(日期)
将序列号转换为年
YEAR(NOW())
>>2017
MONTH ★month(日期)
将序列号转换为月
MONTH(NOW())
>>1
DAY ★day(日期)
将序列号转换为月份中的日
DAY(NOW())
>>7
HOUR ★hour(日期)
将序列号转换为小时
HOUR(NOW())
>>11
MINUTE ★minute(日期)
将序列号转换为分钟
MINUTE(NOW())
>>12
SECOND ★second(日期)
将序列号转换为秒
SECOND(NOW())
>>34
WEEKDAY ★weekday(日期)
将序列号转换为星期几
WEEKDAY(date(2017, 1, 7))
>>7
dateDIFdateDif(开始日期, 结束日期, 类型Y/M/D/YD/MD/YM)
返回两个日期的相隔天数
dateDIF("1975-1-30", "2017-1-7", "Y")
>>41
DAYS360days360(开始日期, 结束日期[, 选项0/1])
以一年 360 天为基准计算两个日期间的天数
DAYS360('1975-1-30', '2017-1-7')
>>15097
EDATEeDate(开始日期, 月数)
返回用于表示开始日期之前或之后月数的日期的序列号
EDATE("2012-1-31", 32)
>>2014-09-30
EOMONTHeoMonth(开始日期, 月数)
返回指定月数之前或之后的月份的最后一天的序列号
EOMONTH("2012-2-1", 32)
>>2014-10-31
netWorkdaysnetWorkdays(开始日期, 结束日期[, 假日])
返回两个日期之间的全部工作日数
netWorkdays("2012-1-1", "2013-1-1")
>>262
workDayworkday(开始日期, 天数[, 假日])
返回指定的若干个工作日之前或之后的日期的序列号
workDay("2012-1-2", 145)
>>2012-07-23
WEEKNUMweekNum(日期[, 类型:1/2])
将序列号转换为一年中相应的周数
WEEKNUM("2016-1-3")
>>2
DAYSdays(结束日期, 开始日期)
返回两个日期之间的天数
DAYS("2017-1-7", "2017-1-1")
>>6
YEARFRACyearfrac(开始日期, 结束日期[, 基准类型:0-4])
返回两个日期之间的天数占全年天数的比例
YEARFRAC("2012-1-1", "2012-7-1")
>>0.5
扩展函数
函数名说明示例
AddYears ★AddYears(时间, 数值)
增加年。
AddMonths ★AddMonths(时间, 数值)
增加月。
AddDays ★AddDays(时间, 数值)
增加日。
AddHours ★AddHours(时间, 数值)
增加小时。
AddMinutes ★AddMinutes(时间, 数值)
增加分钟。
AddSeconds ★AddSeconds(时间, 数值)
增加秒。
DateValue ★DateValue(值, 数值)
转成时间
DateValue(文本/数值, 0)
解析,自动匹配与当前日期相近的日期
DateValue(文本, 1)
解析年月日文本
DateValue(数值, 2)
转成日期,Excel数值
DateValue(数值, 3)
转成日期,时间戳(毫秒)
DateValue(数值, 4)
转成日期,时间戳(秒)
Timestamp ★Timestamp(值[, 数值=0])
转成时间戳,默认为毫秒
Timestamp(时间, 0)
转成时间戳(毫秒)
Timestamp(时间, 1)
转成时间戳(秒)

注:UseLocalTime属性影响 DateValue/Timestamp 转换,设置true,直接转成本地时间。

财务函数

函数名说明示例
PMTpmt(利率, 期数, 现值[, 终值[, 类型]])
计算在定期支付、固定利率的情况下贷款的每期付款额
PMT(0.08/12, 10, 10000)
>>-1037.03
PPMTppmt(利率, 期数, 总期数, 现值[, 终值[, 类型]])
计算在定期支付、固定利率的情况下贷款的每期本金付款额
PPMT(0.08/12, 1, 10, 10000)
>>-970.37
IPMTipmt(利率, 期数, 总期数, 现值[, 终值[, 类型]])
计算在定期支付、固定利率的情况下贷款的每期利息付款额
IPMT(0.08/12, 1, 10, 10000)
>>-66.67
PVpv(利率, 期数, 每期付款[, 终值[, 类型]])
计算投资的现值
PV(0.08/12, 10, -1000)
>>9637.09
FVfv(利率, 期数, 每期付款[, 现值[, 类型]])
计算投资的终值
FV(0.08/12, 10, -1000)
>>10413.84
NPERnper(利率, 每期付款, 现值[, 终值[, 类型]])
计算投资的期数
NPER(0.08/12, -1000, 10000)
>>10.7
RATErate(期数, 每期付款, 现值[, 终值[, 类型[, 猜测值]]])
计算投资的每期利率
RATE(4*12, -200, 8000)
>>0.0077
NPVnpv(利率, 数值1, ...)
计算一系列定期现金流的净现值
NPV(0.1, -10000, 3000, 4200, 6800)
>>1188.44
XNPVxnpv(利率, 现金流数组, 日期数组)
计算一系列非定期现金流的净现值
XNPV(0.09, array(-10000, 2750, 4250, 3250, 2750), array('2008-1-1', '2008-3-1', '2008-10-30', '2009-2-15', '2009-4-1'))
>>2086.65
IRRirr(现金流数组[, 猜测值])
计算一系列现金流的内部收益率
IRR(array(-70000, 12000, 15000, 18000, 21000, 26000))
>>0.0866
MIRRmirr(现金流数组, 融资利率, 再投资利率)
计算一系列现金流的修正内部收益率
MIRR(array(-70000, 12000, 15000, 18000, 21000, 26000), 0.1, 0.12)
>>0.0797
XIRRxirr(现金流数组, 日期数组[, 猜测值])
计算一系列非定期现金流的内部收益率
XIRR(array(-10000, 2750, 4250, 3250, 2750), array('2008-1-1', '2008-3-1', '2008-10-30', '2009-2-15', '2009-4-1'))
>>0.3734
SLNsln(原值, 残值, 使用年限)
计算资产的直线折旧
SLN(30000, 7500, 10)
>>2250
DBdb(原值, 残值, 使用年限, 期数[, 月数])
计算资产的余额递减折旧
DB(1000000, 100000, 6, 1)
>>319000
DDBddb(原值, 残值, 使用年限, 期数[, 余额递减率])
计算资产的双倍余额递减折旧
DDB(2400, 300, 10, 2)
>>384
SYDsyd(原值, 残值, 使用年限, 期数)
计算资产的年数总和折旧
SYD(30000, 7500, 10, 1)
>>4090.91

统计函数

函数名说明示例
MAXmax(数值, ...)
返回参数列表中的最大值
max(1, 2, 3, 4, 2, 2, 1, 4)
>>4
MEDIANmedian(数值, ...)
返回给定数值的中值
MEDIAN(1, 2, 3, 4, 2, 2, 1, 4)
>>2
MINmin(数值, ...)
返回参数列表中的最小值
MIN(1, 2, 3, 4, 2, 2, 1, 4)
>>1
QUARTILEquartile(数值, 四分位:0-4)
返回数据集的四分位数
QUARTILE({1, 2, 3, 4, 2, 2, 1, 4}, 0)
>>1
MODEmode(数值, ...)
返回在数组中出现频率最多的数值
MODE(1, 2, 3, 4, 2, 2, 1, 4)
>>2
LARGE ▲large(数组, K)
返回数据集中第 k 个最大值
LARGE({1, 2, 3, 4, 2, 2, 1, 4}, 3)
>>3
SMALL ▲small(数值, K)
返回数据集中第 k 个最小值
SMALL({1, 2, 3, 4, 2, 2, 1, 4}, 3)
>>2
LookCeiling
LookCeil
lookCeiling(数值, 数组)
在数组中查找大于等于指定值的最小值
LookCeiling(2.5, [1, 2, 3, 4, 5])
>>3
LookFloorlookFloor(数值, 数组)
在数组中查找小于等于指定值的最大值
LookFloor(2.5, [1, 2, 3, 4, 5])
>>2
ARRAYarray(值1, 值2, ...)
创建数组
ARRAY(1, 2, 3)
>>[1, 2, 3]
PERCENTILE
PERCENTILE.INC
percentile(数值, K)
返回区域中的第 k 个百分位值
PERCENTILE({1, 2, 3, 4, 2, 2, 1, 4}, 0.4)
>>2
PERCENTRANK
PERCENTRANK.INC
percentRank(数值, K)
返回数据集中值的百分比排位
PERCENTRANK({1, 2, 3, 4, 2, 2, 1, 4}, 3)
>>0.714
AVERAGEaverage(数值, ...)
返回参数的平均值
AVERAGE(1, 2, 3, 4, 2, 2, 1, 4)
>>2.375
averageIfaverageIf({数值, ...}, 条件[, {值1, ...}])
返回参数的平均值
averageIf({1, 2, 3, 4, 2, 2, 1, 4}, '>1')
>>2.833333333
GEOMEANgeoMean(数值, ...)
返回正数数组或区域的几何平均值
GEOMEAN(1, 2, 3, 4)
>>2.213363839
HARMEANharMean(数值, ...)
返回数据集合的调和平均值
HARMEAN(1, 2, 3, 4)
>>1.92
COUNTcount(数值, ...)
计算参数列表中数值的个数
COUNT(1, 2, 3, 4, 2, 2, 1, 4)
>>8
countIfcountIf({数值, ...}, 条件[, {值1, ...}])
计算参数列表中数值的个数
countIf({1, 2, 3, 4, 2, 2, 1, 4}, '>1')
>>6
SUMsum(数值, ...)
返回所有数值之和。
SUM(1, 2, 3, 4)
>>10
sumIfsumIf({数值, ...}, 条件[, {值1, ...}])
返回所有数值之和
sumIf({1, 2, 3, 4, 2, 2, 1, 4}, '>1')
>>17
AVEDEVaveDev(数值, ...)
返回数据点与其平均值的绝对偏差的平均值
AVEDEV(1, 2, 3, 4, 2, 2, 1, 4)
>>0.96875
STDEV
STDEV.S
stDev(数值, ...)
基于样本估算标准偏差
STDEV(1, 2, 3, 4, 2, 2, 1, 4)
>>1.1877349391654208
STDEVP
STDEV.P
stDevp(数值, ...)
计算基于整个样本总体的标准偏差
STDEVP(1, 2, 3, 4, 2, 2, 1, 4)
>>1.1110243021644486
DEVSQdevSq(数值, ...)
返回偏差的平方和
DEVSQ(1, 2, 3, 4, 2, 2, 1, 4)
>>9.875
VAR
VAR.S
var(数值, ...)
基于样本估算方差
VAR(1, 2, 3, 4, 2, 2, 1, 4)
>>1.4107142857142858
VARP
VAR.P
varp(数值, ...)
基于整个样本总体计算方差
VARP(1, 2, 3, 4, 2, 2, 1, 4)
>>1.234375
normDist
NORM.DIST
normDist(数值, 算术平均值, 标准偏差, 返回类型:0/1)
返回正态累积分布
normDist(3, 8, 4, 1)
>>0.105649774
normInv
NORM.INV
normInv(分布概率, 算术平均值, 标准偏差)
返回反正态累积分布
normInv(0.8, 8, 3)
>>10.5248637
NormSDist
NORM.S.DIST
normSDist(数值)
返回标准正态累积分布函数, 该分布的平均值为 0, 标准偏差为 1。
NORMSDist(1)
>>0.841344746
normSInv
NORM.S.INV
normSInv(数值)
返回反标准正态累积分布
normSInv(0.3)
>>-0.524400513
BetaDist
BETA.DIST
BetaDist(数值, 分布参数α, 分布参数β)
返回 Beta 累积分布函数
BetaDist(0.5, 11, 22)
>>0.97494877
BetaInv
BETA.INV
BetaInv(数值, 分布参数α, 分布参数β)
返回指定 Beta 分布的累积分布函数的反函数
BetaInv(0.5, 23, 45)
>>0.336640759
binomDist
BINOM.DIST
binomDist(试验成功次数, 试验次数, 成功概率, 返回类型:0/1)
返回一元二项式分布概率
binomDist(12, 45, 0.5, 0)
>>0.000817409
exponDist
EXPON.DIST
exponDist(函数值, 参数值, 返回类型:0/1)
返回指数分布
exponDist(3, 1, 0)
>>0.049787068
FDist
F.DIST
fDist(数值X, 分子自由度, 分母自由度)
返回 F 概率分布
FDist(0.4, 2, 3)
>>0.701465776
FInv
F.INV
fInv(分布概率, 分子自由度, 分母自由度)
返回 F 概率分布的反函数
FInv(0.7, 2, 3)
>>0.402651432
FISHERfisher(数值)
返回点 x 的 Fisher 变换。该变换生成一个正态分布而非偏斜的函数
FISHER(0.68)
>>0.8291140383
fisherInvfisherInv(数值)
返回 Fisher 变换的反函数值。
fisherInv(0.6)
>>0.537049567
gammaDist
GAMMA.DIST
gammaDist(数值, 分布参数α, 分布参数β, 返回类型:0/1)
返回 γ 分布
gammaDist(0.5, 3, 4, 0)
>>0.001723627
gammaInv
GAMMA.INV
gammaInv(分布概率, 分布参数α, 分布参数β)
返回 γ 累积分布函数的反函数
gammaInv(0.2, 3, 4)
>>6.140176811
GAMMALN
GAMMALN.PRECISE
gammaLn(数值)
返回 γ 的自然对数
GAMMALN(4)
>>1.791759469
hypgeomDist
HYPGEOM.DIST
hypgeomDist(样本成功次数, 样本容量, 样本总体成功次数, 样本总体容量)
返回超几何分布
hypgeomDist(23, 45, 45, 100)
>>0.08715016
logInv
LOGNORM.INV
logInv(分布概率, 算术平均数, 标准偏差)
返回 x 的对数累积分布函数的反函数
logInv(0.1, 45, 33)
>>15.01122624
LognormDist
LOGNORM.DIST
lognormDist(数值, 算术平均数, 标准偏差)
返回对数正态分布
lognormDist(15, 23, 45)
>>0.326019201
negbinomDist
NEGBINOM.DIST
negbinomDist(失败次数, 成功次数, 成功概率)
返回负二项式分布
negbinomDist(23, 45, 0.7)
>>0.053463314
POISSON
POISSON.DIST
poisson(数值, 算术平均数, 返回类型:0/1)
返回 Poisson 分布
POISSON(23, 23, 0)
>>0.082884384
TDist
T.DIST
tDist(数值, 自由度, 返回类型:1/2)
返回学生的 t 分布
TDist(1.2, 24, 1)
>>0.120925677
TInv
T.INV
TInv(分布概率, 自由度)
返回学生的 t 分布的反分布
TInv(0.12, 23)
>>1.614756561
WEIBULLweibull(数值, 分布参数α, 分布参数β, 返回类型:0/1)
返回 Weibull 分布
WEIBULL(1, 2, 3, 1)
>>0.105160683
COVAR
COVARIANCE.P
COVAR(数组1, 数组2)
返回 总体协方差
COVAR(array(3,7,6,11),array(5,15,13,9))
>>3.375
COVARIANCE.SCOVARIANCE.S(数组1, 数组2)
返回 样本协方差
COVARIANCE.S(array(3,7,6,11),array(5,15,13,9))
>>4.5
RANKrank(数值, 数组[, 排序方式:0/1])
返回数值在数组中的排名
RANK(3, array(1, 2, 3, 4, 5))
>>3
FORECASTforecast(X, Y数组, X数组)
根据线性趋势返回预测值
FORECAST(30, array(6, 7, 9, 15, 21), array(20, 28, 31, 38, 40))
>>10.61
INTERCEPTintercept(Y数组, X数组)
返回线性回归线的截距
INTERCEPT(array(2, 3, 9, 1, 8), array(6, 5, 11, 7, 5))
>>0.05
SLOPEslope(Y数组, X数组)
返回线性回归线的斜率
SLOPE(array(2, 3, 9, 1, 8), array(6, 5, 11, 7, 5))
>>0.67
CORRELcorrel(数组1, 数组2)
返回两个数组之间的相关系数
CORREL(array(3, 2, 4, 5, 6), array(9, 7, 12, 15, 17))
>>0.997
PEARSONpearson(数组1, 数组2)
返回Pearson乘积矩相关系数
PEARSON(array(3, 2, 4, 5, 6), array(9, 7, 12, 15, 17))
>>0.997

增加函数 类C#方法

函数名说明示例
UrlEncode ★UrlEncode(文本)
对 URL 字符串进行编码。
UrlDecode ★UrlDecode(文本)
将 URL 编码的字符串转换为已解码的字符串。
HtmlEncode ★HtmlEncode(文本)
将字符串转换为 HTML 编码的字符串。
HtmlDecode ★HtmlDecode(文本)
将HTML编码的字符串转换为已解码的字符串。
Base64ToText ★Base64ToText(文本)
将Base64转换为字符串。
Base64UrlToText ★Base64UrlToText(文本)
将Url类型的Base64 转换为字符串。
TextToBase64 ★TextToBase64(文本)
将字符串转换为Base64字符串。
TextToBase64Url ★TextToBase64Url(文本)
将字符串 转换为Url类型的Base64 字符串。
Regex ★Regex(文本, 匹配文本)
返回匹配的字符串。
REGEXREPLACE ★REGEXREPLACE(文本, 匹配文本, 替换文本)
匹配替换字符串。
IsRegex ★
IsMatch ★
IsRegex(文本, 匹配文本)
IsMatch(文本, 匹配文本)
判断是否匹配。
GuidGuid()
生成Guid字符串。
Md5 ★Md5(文本)
返回Md5的Hash字符串。
Sha1 ★Sha1(文本)
返回Sha1的Hash字符串。
Sha256 ★Sha256(文本)
返回Sha256的Hash字符串。
Sha512 ★Sha512(文本)
返回Sha512的Hash字符串。
HmacMd5 ★HmacMd5(文本, secret)
返回HmacMd5的Hash字符串。
HmacSha1 ★HmacSha1(文本, secret)
返回HmacSha1的Hash字符串。
HmacSha256 ★HmacSha256(文本, secret)
返回HmacSha256的Hash字符串。
HmacSha512 ★HmacSha512(文本, secret)
返回HmacSha512的Hash字符串。
TrimStart ★
LTrim ★
TrimStart(文本)
LTrim(文本)
LTrim(文本[, 字符集])
去除字符串左边的字符。
TrimEnd ★
RTrim ★
TrimEnd(文本)
RTrim(文本)
RTrim(文本, 字符集)
去除字符串右边的字符。
IndexOf ★ ▲IndexOf(文本, 查找文本[, 开始位置[, 索引]])
查找字符串位置。
LastIndexOf ★ ▲LastIndexOf(文本, 查找文本[, 开始位置[, 索引]])
查找字符串位置。
Split ★Split(文本, 分隔符)
生成数组
Split(文本, 分隔符, 索引)
返回分割后索引指向的字符串。
Join ★Join(文本1, 文本2....)
合并字符串。
Substring ★ ▲Substring(文本, 位置)
Substring(文本, 位置, 数量)
切割字符串。
StartsWith ★StartsWith(文本, 开始文本[, 是否忽略大小写:1/0])
确定此字符串实例的开头是否与指定的字符串匹配。
EndsWith ★EndsWith(文本, 结束文本[, 是否忽略大小写:1/0])
确定使用指定的比较选项进行比较时此字符串实例的结尾是否与指定的字符串匹配。
IsNullOrEmpty ★IsNullOrEmpty(文本)
指示指定的字符串是 null 还是 空字符串。
IsNullOrWhiteSpace ★IsNullOrWhiteSpace(文本)
指示指定的字符串是 null、空还是仅由空白字符组成。
RemoveStart ★RemoveStart(文本, 左边文本[, 忽略大小写])
匹配左边,成功则去除左边字符串。
RemoveEnd ★RemoveEnd(文本, 右边文本[, 忽略大小写])
匹配右边,成功则去除右边字符串。
Json ★json(文本)
动态json查询。
Error Error(文本)
主动抛错。
HAS ★
HASKEY ★
CONTAINS ★
CONTAINSKEY ★
HAS(json/数组,文本)
json格式 是否包含Key
数组是否包含值
HASVALUE ★
CONTAINSVALUE ★
HASVALUE(json/数组, 文本)
json格式 是否包含Value
数组是否包含值
PARAM
PARAMETER
GETPARAMETER
GETPARAMETER(文本)
动态获取参数

About

ToolGood.Algorithm is a powerful, lightweight, Excel formula compatible algorithm library aimed at improving developers’ productivity in different business scenes. ToolGood.Algorithm是一个功能强大、轻量级、兼容Excel公式的算法类库,旨在提高开发人员在不同业务场景中的生产力。

Topics

algorithmarithmeticdotnetexcelexcel-expressionsexpressionformulaformula-grammarjavascript

Resources

Readme
License
Activity

Stars

115 stars

Watchers

13 watching

Forks

38 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.