Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xuri
excelize
提交
5f4131ae
excelize
项目概览
xuri
/
excelize
通知
13
Star
2
Fork
4
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
excelize
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
已验证
提交
5f4131ae
编写于
6月 17, 2022
作者:
xurime
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ref #65, new formula function: DAYS360
上级
b69da760
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
67 addition
and
0 deletion
+67
-0
calc.go
calc.go
+52
-0
calc_test.go
calc_test.go
+15
-0
未找到文件。
calc.go
浏览文件 @
5f4131ae
...
...
@@ -419,6 +419,7 @@ type formulaFuncs struct {
// DATEVALUE
// DAY
// DAYS
// DAYS360
// DB
// DDB
// DEC2BIN
...
...
@@ -12330,6 +12331,57 @@ func (fn *formulaFuncs) DAYS(argsList *list.List) formulaArg {
return newNumberFormulaArg(end.Number - start.Number)
}
// DAYS360 function returns the number of days between 2 dates, based on a
// 360-day year (12 x 30 months). The syntax of the function is:
//
// DAYS360(start_date,end_date,[method])
//
func (fn *formulaFuncs) DAYS360(argsList *list.List) formulaArg {
if argsList.Len() < 2 {
return newErrorFormulaArg(formulaErrorVALUE, "DAYS360 requires at least 2 arguments")
}
if argsList.Len() > 3 {
return newErrorFormulaArg(formulaErrorVALUE, "DAYS360 requires at most 3 arguments")
}
startDate := toExcelDateArg(argsList.Front().Value.(formulaArg))
if startDate.Type != ArgNumber {
return startDate
}
endDate := toExcelDateArg(argsList.Front().Next().Value.(formulaArg))
if endDate.Type != ArgNumber {
return endDate
}
start, end := timeFromExcelTime(startDate.Number, false), timeFromExcelTime(endDate.Number, false)
sy, sm, sd, ey, em, ed := start.Year(), int(start.Month()), start.Day(), end.Year(), int(end.Month()), end.Day()
method := newBoolFormulaArg(false)
if argsList.Len() > 2 {
if method = argsList.Back().Value.(formulaArg).ToBool(); method.Type != ArgNumber {
return method
}
}
if method.Number == 1 {
if sd == 31 {
sd--
}
if ed == 31 {
ed--
}
} else {
if getDaysInMonth(sy, sm) == sd {
sd = 30
}
if ed > 30 {
if sd < 30 {
em++
ed = 1
} else {
ed = 30
}
}
}
return newNumberFormulaArg(float64(360*(ey-sy) + 30*(em-sm) + (ed - sd)))
}
// ISOWEEKNUM function returns the ISO week number of a supplied date. The
// syntax of the function is:
//
...
...
calc_test.go
浏览文件 @
5f4131ae
...
...
@@ -1476,6 +1476,15 @@ func TestCalcCellValue(t *testing.T) {
"=DAYS(2,1)"
:
"1"
,
"=DAYS(INT(2),INT(1))"
:
"1"
,
"=DAYS(
\"
02/02/2015
\"
,
\"
01/01/2015
\"
)"
:
"32"
,
// DAYS360
"=DAYS360(
\"
10/10/2020
\"
,
\"
10/10/2020
\"
)"
:
"0"
,
"=DAYS360(
\"
01/30/1999
\"
,
\"
02/28/1999
\"
)"
:
"28"
,
"=DAYS360(
\"
01/31/1999
\"
,
\"
02/28/1999
\"
)"
:
"28"
,
"=DAYS360(
\"
12/12/1999
\"
,
\"
08/31/1999
\"
)"
:
"-101"
,
"=DAYS360(
\"
12/12/1999
\"
,
\"
11/30/1999
\"
)"
:
"-12"
,
"=DAYS360(
\"
12/12/1999
\"
,
\"
11/30/1999
\"
,TRUE)"
:
"-12"
,
"=DAYS360(
\"
01/31/1999
\"
,
\"
03/31/1999
\"
,TRUE)"
:
"60"
,
"=DAYS360(
\"
01/31/1999
\"
,
\"
03/31/2000
\"
,FALSE)"
:
"420"
,
// EDATE
"=EDATE(
\"
01/01/2021
\"
,-1)"
:
"44166"
,
"=EDATE(
\"
01/31/2020
\"
,1)"
:
"43890"
,
...
...
@@ -3447,6 +3456,12 @@ func TestCalcCellValue(t *testing.T) {
"=DAYS(0,
\"\"
)"
:
"#VALUE!"
,
"=DAYS(NA(),0)"
:
"#VALUE!"
,
"=DAYS(0,NA())"
:
"#VALUE!"
,
// DAYS360
"=DAYS360(
\"
12/12/1999
\"
)"
:
"DAYS360 requires at least 2 arguments"
,
"=DAYS360(
\"
12/12/1999
\"
,
\"
11/30/1999
\"
,TRUE,
\"\"
)"
:
"DAYS360 requires at most 3 arguments"
,
"=DAYS360(
\"
12/12/1999
\"
,
\"
11/30/1999
\"
,
\"\"
)"
:
"strconv.ParseBool: parsing
\"\"
: invalid syntax"
,
"=DAYS360(
\"
12/12/1999
\"
,
\"\"
)"
:
"#VALUE!"
,
"=DAYS360(
\"\"
,
\"
11/30/1999
\"
)"
:
"#VALUE!"
,
// EDATE
"=EDATE()"
:
"EDATE requires 2 arguments"
,
"=EDATE(0,
\"\"
)"
:
"strconv.ParseFloat: parsing
\"\"
: invalid syntax"
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录