From b6dd7648a142901655cc4f76cb7d3a6e73338c8f Mon Sep 17 00:00:00 2001 From: xuri Date: Thu, 4 Jun 2020 00:35:54 +0800 Subject: fn: COUNTA --- calc.go | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'calc.go') diff --git a/calc.go b/calc.go index 13baeef..86f7cff 100644 --- a/calc.go +++ b/calc.go @@ -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: // -- cgit v1.2.1