ToolGood.Algorithm =================== English document
ToolGood.Algorithm是一个功能强大、轻量级、兼容Excel公式的算法类库,旨在提高开发人员在不同业务场景中的生产力。
注:ToolGood.Algorithm主要以Decimal为基础,Decimal精度高,不代表没有误差,速度较double慢。
适用场景: 代码与算法分离,避免项目强制升级
1)项目初期,未确定的算法;
2)项目维护时,经常改动的算法,不想硬编码的代码;
3)财务数据、统计数据之中的算法,(注:Decimal精度高,也有误差,建议使用分为单位);
快速上手
`` csharp
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版本开始,禁止时间转数字,数字转时间,时间加减乘除数字,相关操作使用
函数代替。
自定义参数
csharp
//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 获取参数名、自定义方法名。
辅助方法
csharp
// 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)。
注:公式计算时,先将带单位的数量转成标准单位,再进行数字计算。
csharp
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 用于构建可追溯的多步骤计算流程:通过初始化值、检查条件、公式赋值、设置值等步骤逐步计算,并自动输出完整的计算过程信息,便于审计、调试与流程跟踪。
csharp
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", "pricecount0.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 = pricecount0.8 = 10030.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。
逻辑函数
函数名 说明 示例
IF if(测试条件, 真值[, 假值])
执行真假值判断, 根据逻辑计算的真假值, 返回不同结果。
if(1=1, 1, 2)
>>1
IFS ifs(条件1, 值1, 条件2, 值2, ...)
检查是否满足一个或多个条件, 且返回第一个TRUE条件对应的值。
IFS(1=1, 'a', 1=2, 'b')
>>a
SWITCH switch(表达式, 值1, 结果1, 值2, 结果2, ...)
根据值列表计算表达式的值, 并返回对应结果。
SWITCH(1, 1, 'one', 2, 'two')
>>one
ifError ifError(测试条件, 真值[, 假值])
如果公式计算出错误则返回您指定的值;否则返回公式结果。
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
AND and(逻辑值1, ...)
如果所有参数均为TRUE, 则返回TRUE, 如有错误先报错
and(1, 2=2)
>>true
OR or(逻辑值1, ...)
如果任一参数为TRUE, 则返回TRUE, 如有错误先报错
or(1, 2=3)
>>true
XOR xor(逻辑值1, ...)
返回所有参数的异或值, 奇数个TRUE返回TRUE
xor(true(), false())
>>true
NOT not(逻辑值)
对参数的逻辑值求反
NOT(true())
>>false
TRUE true()
返回逻辑值TRUE
true()
>>true
FALSE false()
返回逻辑值FALSE
false()
>>false
数学与三角函数
分类 函数名 说明 示例
基
础
数
学
E e()
返回 e 值
E()
>>
PI pi()
返回 PI 值
pi()
>>3.141592654
abs abs(数值)
返回数值的绝对值
abs(-1)
>>1
QUOTIENT quotient(被除数, 除数)
返回商的整数部分, 该函数可用于舍掉商的小数部分。
QUOTIENT(7, 3)
>>2
mod mod(被除数, 除数)
返回两数相除的余数
MOD(7, 3)
>>1
SIGN sign(数值)
返回数值的符号。当数值为正数时返回 1, 为零时返回 0, 为负数时返回 -1。
SIGN(-9)
>>-1
SQRT sqrt(数值)
返回正平方根
SQRT(9)
>>3
TRUNC trunc(数值)
将数值截尾取整
TRUNC(9.222)
>>9
int ★ int(数值)
将数值向下舍入到最接近的整数。
int(9.222)
>>9
gcd gcd(数值, ...)
返回最大公约数
GCD(3, 5, 7)
>>1
LCM lcm(数值, ...)
返回整数参数的最小公倍数
LCM(3, 5, 7)
>>105
combin combin(总数, 选取数)
计算从给定数目的对象集合中提取若干对象的组合数
combin(10, 2)
>>45
PERMUT permut(总数, 选取数)
返回从给定数目的对象集合中选取的若干对象的排列数
PERMUT(10, 2)
>>90
FIXED fixed(数值[, 小数位数[, 有无逗号分隔符]])
将数值设置为具有固定小数位的文本格式
FIXED(4567.89, 1)
>>4,567.9
三
角
函
数
degrees degrees(弧度)
将弧度转换为度
degrees(pi())
>>180
RADIANS radians(度)
将度转换为弧度
RADIANS(180)
>>3.141592654
cos cos(弧度)
返回数值的余弦值
cos(1)
>>0.540302305868
cosh cosh(弧度)
返回数值的双曲余弦值
cosh(1)
>>1.54308063481
SIN sin(弧度)
返回给定角度的正弦值
sin(1)
>>0.84147098480
SINH sinh(弧度)
返回数值的双曲正弦值
sinh(1)
>>1.1752011936
TAN tan(弧度)
返回数值的正切值
tan(1)
>>1.55740772465
TANH tanh(弧度)
返回数值的双曲正切值
tanh(1)
>>0.761594155955
acos acos(数值)
返回数值的反余弦值
acos(0.5)
>>1.04719755119
acosh acosh(数值)
返回数值的反双曲余弦值
acosh(1.5)
>>0.962423650119
asin asin(数值)
返回数值的反正弦值
asin(0.5)
>>0.523598775598
asinh asinh(数值)
返回数值的反双曲正弦值。
asinh(1.5)
>>1.1947632172
atan atan(数值)
返回数值的反正切值
atan(1)
>>0.785398163397
atanh atanh(数值)
返回参数的反双曲正切值
atanh(0.5)
>>0.549306144334
atan2 atan2(x坐标, y坐标)
从X和Y坐标返回反正切
atan2(1, 2)
>>1.10714871779
COT cot(弧度)
返回数值的余切值
cot(1)
>>0.64209261593
COTH coth(弧度)
返回数值的双曲余切值
coth(1)
>>1.31303528549
CSC csc(弧度)
返回数值的余割值
csc(1)
>>1.18839510578
CSCH csch(弧度)
返回数值的双曲余割值
csch(1)
>>0.85091812823
SEC sec(弧度)
返回数值的正割值
sec(1)
>>1.85081571768
SECH sech(弧度)
返回数值的双曲正割值
sech(1)
>>0.64805427366
ACOT acot(数值)
返回数值的反余切值
acot(1)
>>0.78539816339
ACOTH acoth(数值)
返回数值的反双曲余切值
acoth(2)
>>0.54930614433
四
舍
五
入
ROUND round(数值, 小数位数)
返回某个数值按指定位数取整后的数值。
ROUND(4.333, 2)
>>4.33
roundDown roundDown(数值, 小数位数)
靠近零值, 向下(绝对值减小的方向)舍入数值。
roundDown(4.333, 2)
>>4.33
roundUp roundUp(数值, 小数位数)
远离零值, 向上(绝对值增长的方向)舍入数值。
roundUp(4.333, 2)
>>4.34
CEILING
CEIL ceiling(数值, 舍入基数)
向上舍入(沿绝对值增大的方向)为最接近的 舍入基数 的倍数。
CEILING(4.333, 0.1)
>>4.4
floor floor(数值, 舍入基数)
向下舍入, 使其等于最接近的 Significance 的倍数。
FLOOR(4.333, 0.1)
>>4.3
even even(数值)
返回沿绝对值增大方向取整后最接近的偶数。
EVEN(3)
>>4
ODD odd(数值)
将数值向上舍入为最接近的奇数整数
ODD(3.1)
>>5
MROUND mround(数值, 舍入基数)
返回一个舍入到所需倍数的数值
MROUND(13, 5)
>>15
随
机
数
RAND rand()
返回 0 到 1 之间的随机数
RAND()
>>0.2
randBetween randBetween(最小整数, 最大整数)
返回大于等于指定的最小值, 小于指定最大值之间的一个随机整数。
randBetween(2, 44)
>>9
幂
/
对
数
/
阶
乘
fact fact(数值)
返回数的阶乘, 一个数的阶乘等于 123… 该数。
FACT(3)
>>6
factdouble factDouble(数值)
返回数值的双倍阶乘
factDouble(10)
>>3840
POWER power(数值, 幂)
返回数的乘幂结果
POWER(10, 2)
>>100
exp exp(幂)
返回e的指定数乘幂
exp(2)
>>7.389056099
ln ln(数值)
返回数值的自然对数
LN(4)
>>1.386294361
log log(数值[, 底数])
返回数值的常用对数, 如省略底数, 默认为10
LOG(100, 10)
>>2
LOG10 log10(数值)
返回数值以10为底的对数
LOG10(100)
>>2
MULTINOMIAL multinomial(数值, ...)
返回参数和的阶乘与各参数阶乘乘积的比值
MULTINOMIAL(1, 2, 3)
>>60
PRODUCT product(数值, ...)
将所有以参数形式给出的数值相乘, 并返回乘积值。
PRODUCT(1, 2, 3, 4)
>>24
SqrtPi SqrtPi(数值)
返回某数与 PI 的乘积的平方根
SqrtPi(3)
>>3.069980124
ERF erf(数值)
返回误差函数值
ERF(1)
>>0.842701
ERFC erfc(数值)
返回补余误差函数值
ERFC(1)
>>0.157299
BESSELI besselI(x, n)
返回修正贝塞尔函数 In(x)
BESSELI(1.5, 1)
>>0.981666
BESSELJ besselJ(x, n)
返回贝塞尔函数 Jn(x)
BESSELJ(1.5, 1)
>>0.557937
BESSELK besselK(x, n)
返回修正贝塞尔函数 Kn(x)
BESSELK(1.5, 1)
>>0.277388
BESSELY besselY(x, n)
返回贝塞尔函数 Yn(x)
BESSELY(1.5, 1)
>>-0.412309
DELTA delta(数值1[, 数值2])
检验两个数值是否相等, 相等返回1, 否则返回0
DELTA(5, 5)
>>1
GESTEP gestep(数值[, 阈值])
检验数值是否大于等于阈值, 大于等于返回1, 否则返回0
GESTEP(5, 4)
>>1
SUMSQ sumSq(数值, ...)
返回参数的平方和
SUMSQ(1, 2)
>>5
SUMPRODUCT sumproduct(数组1, 数组2, ...)
返回数组对应元素乘积之和
SUMPRODUCT(array(1, 2, 3), array(4, 5, 6))
>>32
SUMX2MY2 sumx2my2(数组X, 数组Y)
返回两数组中对应数值的平方差之和
SUMX2MY2(array(1, 2, 3), array(4, 5, 6))
>>-63
SUMX2PY2 sumx2py2(数组X, 数组Y)
返回两数组中对应数值的平方和之和
SUMX2PY2(array(1, 2, 3), array(4, 5, 6))
>>91
SUMXMY2 sumxmy2(数组X, 数组Y)
返回两数组中对应数值之差的平方和
SUMXMY2(array(1, 2, 3), array(4, 5, 6))
>>27
SERIESSUM seriessum(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
日期与时间函数
函数名 说明 示例
NOW now()
返回当前日期和时间的序列号
NOW()
>>2017-01-07 11:00:00
TODAY today()
返回今天日期的序列号
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
dateDIF dateDif(开始日期, 结束日期, 类型Y/M/D/YD/MD/YM)
返回两个日期的相隔天数
dateDIF("1975-1-30", "2017-1-7", "Y")
>>41
DAYS360 days360(开始日期, 结束日期[, 选项0/1])
以一年 360 天为基准计算两个日期间的天数
DAYS360('1975-1-30', '2017-1-7')
>>15097
EDATE eDate(开始日期, 月数)
返回用于表示开始日期之前或之后月数的日期的序列号
EDATE("2012-1-31", 32)
>>2014-09-30
EOMONTH eoMonth(开始日期, 月数)
返回指定月数之前或之后的月份的最后一天的序列号
EOMONTH("2012-2-1", 32)
>>2014-10-31
netWorkdays netWorkdays(开始日期, 结束日期[, 假日])
返回两个日期之间的全部工作日数
netWorkdays("2012-1-1", "2013-1-1")
>>262
workDay workday(开始日期, 天数[, 假日])
返回指定的若干个工作日之前或之后的日期的序列号
workDay("2012-1-2", 145)
>>2012-07-23
WEEKNUM weekNum(日期[, 类型:1/2])
将序列号转换为一年中相应的周数
WEEKNUM("2016-1-3")
>>2
DAYS days(结束日期, 开始日期)
返回两个日期之间的天数
DAYS("2017-1-7", "2017-1-1")
>>6
YEARFRAC yearfrac(开始日期, 结束日期[, 基准类型: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`,直接转成本地时间。
财务函数
| 函数名 | 说明 | 示例 |
| PMT | pmt(利率, 期数, 现值[, 终值[, 类型]]) 计算在定期支付、固定利率的情况下贷款的每期付款额 |
PMT(0.08/12, 10, 10000) >>-1037.03 |
| PPMT | ppmt(利率, 期数, 总期数, 现值[, 终值[, 类型]]) 计算在定期支付、固定利率的情况下贷款的每期本金付款额 |
PPMT(0.08/12, 1, 10, 10000) >>-970.37 |
| IPMT | ipmt(利率, 期数, 总期数, 现值[, 终值[, 类型]]) 计算在定期支付、固定利率的情况下贷款的每期利息付款额 |
IPMT(0.08/12, 1, 10, 10000) >>-66.67 |
| PV | pv(利率, 期数, 每期付款[, 终值[, 类型]]) 计算投资的现值 |
PV(0.08/12, 10, -1000) >>9637.09 |
| FV | fv(利率, 期数, 每期付款[, 现值[, 类型]]) 计算投资的终值 |
FV(0.08/12, 10, -1000) >>10413.84 |
| NPER | nper(利率, 每期付款, 现值[, 终值[, 类型]]) 计算投资的期数 |
NPER(0.08/12, -1000, 10000) >>10.7 |
| RATE | rate(期数, 每期付款, 现值[, 终值[, 类型[, 猜测值]]]) 计算投资的每期利率 |
RATE(4*12, -200, 8000) >>0.0077 |
| NPV | npv(利率, 数值1, ...) 计算一系列定期现金流的净现值 |
NPV(0.1, -10000, 3000, 4200, 6800) >>1188.44 |
| XNPV | xnpv(利率, 现金流数组, 日期数组) 计算一系列非定期现金流的净现值 |
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 |
| IRR | irr(现金流数组[, 猜测值]) 计算一系列现金流的内部收益率 |
IRR(array(-70000, 12000, 15000, 18000, 21000, 26000)) >>0.0866 |
| MIRR | mirr(现金流数组, 融资利率, 再投资利率) 计算一系列现金流的修正内部收益率 |
MIRR(array(-70000, 12000, 15000, 18000, 21000, 26000), 0.1, 0.12) >>0.0797 |
| XIRR | xirr(现金流数组, 日期数组[, 猜测值]) 计算一系列非定期现金流的内部收益率 |
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 |
| SLN | sln(原值, 残值, 使用年限) 计算资产的直线折旧 |
SLN(30000, 7500, 10) >>2250 |
| DB | db(原值, 残值, 使用年限, 期数[, 月数]) 计算资产的余额递减折旧 |
DB(1000000, 100000, 6, 1) >>319000 |
| DDB | ddb(原值, 残值, 使用年限, 期数[, 余额递减率]) 计算资产的双倍余额递减折旧 |
DDB(2400, 300, 10, 2) >>384 |
| SYD | syd(原值, 残值, 使用年限, 期数) 计算资产的年数总和折旧 |
SYD(30000, 7500, 10, 1) >>4090.91 |
统计函数
| 函数名 | 说明 | 示例 |
| MAX | max(数值, ...) 返回参数列表中的最大值 |
max(1, 2, 3, 4, 2, 2, 1, 4) >>4 |
| MEDIAN | median(数值, ...) 返回给定数值的中值 |
MEDIAN(1, 2, 3, 4, 2, 2, 1, 4) >>2 |
| MIN | min(数值, ...) 返回参数列表中的最小值 |
MIN(1, 2, 3, 4, 2, 2, 1, 4) >>1 |
| QUARTILE | quartile(数值, 四分位:0-4) 返回数据集的四分位数 |
QUARTILE({1, 2, 3, 4, 2, 2, 1, 4}, 0) >>1 |
| MODE | mode(数值, ...) 返回在数组中出现频率最多的数值 |
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 |
| LookFloor | lookFloor(数值, 数组) 在数组中查找小于等于指定值的最大值 |
LookFloor(2.5, [1, 2, 3, 4, 5]) >>2 |
| ARRAY | array(值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 |
| AVERAGE | average(数值, ...) 返回参数的平均值 |
AVERAGE(1, 2, 3, 4, 2, 2, 1, 4) >>2.375 |
| averageIf | averageIf({数值, ...}, 条件[, {值1, ...}]) 返回参数的平均值 |
averageIf({1, 2, 3, 4, 2, 2, 1, 4}, '>1') >>2.833333333 |
| GEOMEAN | geoMean(数值, ...) 返回正数数组或区域的几何平均值 |
GEOMEAN(1, 2, 3, 4) >>2.213363839 |
| HARMEAN | harMean(数值, ...) 返回数据集合的调和平均值 |
HARMEAN(1, 2, 3, 4) >>1.92 |
| COUNT | count(数值, ...) 计算参数列表中数值的个数 |
COUNT(1, 2, 3, 4, 2, 2, 1, 4) >>8 |
| countIf | countIf({数值, ...}, 条件[, {值1, ...}]) 计算参数列表中数值的个数 |
countIf({1, 2, 3, 4, 2, 2, 1, 4}, '>1') >>6 |
| SUM | sum(数值, ...) 返回所有数值之和。 |
SUM(1, 2, 3, 4) >>10 |
| sumIf | sumIf({数值, ...}, 条件[, {值1, ...}]) 返回所有数值之和 |
sumIf({1, 2, 3, 4, 2, 2, 1, 4}, '>1') >>17 |
| AVEDEV | aveDev(数值, ...) 返回数据点与其平均值的绝对偏差的平均值 |
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 |
| DEVSQ | devSq(数值, ...) 返回偏差的平方和 |
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 |
| FISHER | fisher(数值) 返回点 x 的 Fisher 变换。该变换生成一个正态分布而非偏斜的函数 |
FISHER(0.68) >>0.8291140383 |
| fisherInv | fisherInv(数值) 返回 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 |
| WEIBULL | weibull(数值, 分布参数α, 分布参数β, 返回类型: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.S | COVARIANCE.S(数组1, 数组2) 返回 样本协方差 |
COVARIANCE.S(array(3,7,6,11),array(5,15,13,9)) >>4.5 |
| RANK | rank(数值, 数组[, 排序方式:0/1]) 返回数值在数组中的排名 |
RANK(3, array(1, 2, 3, 4, 5)) >>3 |
| FORECAST | forecast(X, Y数组, X数组) 根据线性趋势返回预测值 |
FORECAST(30, array(6, 7, 9, 15, 21), array(20, 28, 3
... (README truncated for length) Related StoriesThe Slow and Quiet Cognitive Atrophy of a Modern Software Engineer
Dev.to
16 hours ago
Foundation Model Engineering: From Theory to Production
Hacker News
1 day ago
What Happens When AI Outgrows the Tests We Use to Measure It?
Dev.to
1 day ago
Understanding FlashAttention Pt 1: Personal Notes
Hacker News
1 day ago
Show HN: StemJSON – a language for LLMs to extend native mobile apps on the fly
Hacker News
1 day ago
Related Stories |