summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--calc.go34
-rw-r--r--calc_test.go3
2 files changed, 34 insertions, 3 deletions
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:
//
diff --git a/calc_test.go b/calc_test.go
index 213f77a..283b9c2 100644
--- a/calc_test.go
+++ b/calc_test.go
@@ -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",