浏览代码

fn: COUNTA

xuri 5 年之前
父节点
当前提交
b6dd7648a1
共有 2 个文件被更改,包括 34 次插入3 次删除
  1. 31 3
      calc.go
  2. 3 0
      calc_test.go

+ 31 - 3
calc.go

@@ -313,7 +313,7 @@ func calcAdd(opdStack *Stack) error {
 	return nil
 	return nil
 }
 }
 
 
-// calcAdd evaluate subtraction arithmetic operations.
+// calcSubtract evaluate subtraction arithmetic operations.
 func calcSubtract(opdStack *Stack) error {
 func calcSubtract(opdStack *Stack) error {
 	if opdStack.Len() < 2 {
 	if opdStack.Len() < 2 {
 		return errors.New("formula not valid")
 		return errors.New("formula not valid")
@@ -333,7 +333,7 @@ func calcSubtract(opdStack *Stack) error {
 	return nil
 	return nil
 }
 }
 
 
-// calcAdd evaluate multiplication arithmetic operations.
+// calcMultiply evaluate multiplication arithmetic operations.
 func calcMultiply(opdStack *Stack) error {
 func calcMultiply(opdStack *Stack) error {
 	if opdStack.Len() < 2 {
 	if opdStack.Len() < 2 {
 		return errors.New("formula not valid")
 		return errors.New("formula not valid")
@@ -353,7 +353,7 @@ func calcMultiply(opdStack *Stack) error {
 	return nil
 	return nil
 }
 }
 
 
-// calcAdd evaluate division arithmetic operations.
+// calcDivide evaluate division arithmetic operations.
 func calcDivide(opdStack *Stack) error {
 func calcDivide(opdStack *Stack) error {
 	if opdStack.Len() < 2 {
 	if opdStack.Len() < 2 {
 		return errors.New("formula not valid")
 		return errors.New("formula not valid")
@@ -2840,6 +2840,34 @@ func (fn *formulaFuncs) TRUNC(argsList *list.List) (result string, err error) {
 
 
 // Statistical functions
 // 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
 // MEDIAN function returns the statistical median (the middle value) of a list
 // of supplied numbers. The syntax of the function is:
 // of supplied numbers. The syntax of the function is:
 //
 //

+ 3 - 0
calc_test.go

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