fn: COUNTA

This commit is contained in:
xuri 2020-06-04 00:35:54 +08:00
parent b62950a39e
commit b6dd7648a1
No known key found for this signature in database
GPG Key ID: BA5E5BB1C948EDF7
2 changed files with 34 additions and 3 deletions

34
calc.go
View File

@ -313,7 +313,7 @@ func calcAdd(opdStack *Stack) error {
return nil
}
// calcAdd evaluate subtraction arithmetic operations.
// calcSubtract evaluate subtraction arithmetic operations.
func calcSubtract(opdStack *Stack) error {
if opdStack.Len() < 2 {
return errors.New("formula not valid")
@ -333,7 +333,7 @@ func calcSubtract(opdStack *Stack) error {
return nil
}
// calcAdd evaluate multiplication arithmetic operations.
// calcMultiply evaluate multiplication arithmetic operations.
func calcMultiply(opdStack *Stack) error {
if opdStack.Len() < 2 {
return errors.New("formula not valid")
@ -353,7 +353,7 @@ func calcMultiply(opdStack *Stack) error {
return nil
}
// calcAdd evaluate division arithmetic operations.
// calcDivide evaluate division arithmetic operations.
func calcDivide(opdStack *Stack) error {
if opdStack.Len() < 2 {
return errors.New("formula not valid")
@ -2840,6 +2840,34 @@ func (fn *formulaFuncs) TRUNC(argsList *list.List) (result string, err error) {
// Statistical functions
// COUNTA function returns the number of non-blanks within a supplied set of
// cells or values. The syntax of the function is:
//
// COUNTA(value1,[value2],...)
//
func (fn *formulaFuncs) COUNTA(argsList *list.List) (result string, err error) {
var count int
for token := argsList.Front(); token != nil; token = token.Next() {
arg := token.Value.(formulaArg)
switch arg.Type {
case ArgString:
if arg.String != "" {
count++
}
case ArgMatrix:
for _, row := range arg.Matrix {
for _, value := range row {
if value.String != "" {
count++
}
}
}
}
}
result = fmt.Sprintf("%d", count)
return
}
// MEDIAN function returns the statistical median (the middle value) of a list
// of supplied numbers. The syntax of the function is:
//

View File

@ -385,6 +385,9 @@ func TestCalcCellValue(t *testing.T) {
"=TRUNC(-99.999,2)": "-99.99",
"=TRUNC(-99.999,-1)": "-90",
// Statistical functions
// COUNTA
`=COUNTA()`: "0",
`=COUNTA(A1:A5,B2:B5,"text",1,2)`: "8",
// MEDIAN
"=MEDIAN(A1:A5,12)": "2",
"=MEDIAN(A1:A5)": "1.5",