summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxuri <xuri.me@gmail.com>2021-03-31 22:01:02 +0800
committerxuri <xuri.me@gmail.com>2021-03-31 22:01:02 +0800
commit9d4bf88b4700eeb5c50d4cc6efb0a2d73e5e8b7f (patch)
tree8e1124e7dc9470237d1aeb33fdb0ddeb712e7432
parent2af96c07149e2b79a06375bdc735c0a8c1f6646e (diff)
#65 fn: QUARTILE and QUARTILE.INC
-rw-r--r--calc.go36
-rw-r--r--calc_test.go11
2 files changed, 47 insertions, 0 deletions
diff --git a/calc.go b/calc.go
index 1610f5e..8f3bfb0 100644
--- a/calc.go
+++ b/calc.go
@@ -350,6 +350,8 @@ var tokenPriority = map[string]int{
// POWER
// PRODUCT
// PROPER
+// QUARTILE
+// QUARTILE.INC
// QUOTIENT
// RADIANS
// RAND
@@ -4625,6 +4627,40 @@ func (fn *formulaFuncs) PERMUTATIONA(argsList *list.List) formulaArg {
return newNumberFormulaArg(math.Pow(num, numChosen))
}
+// QUARTILE function returns a requested quartile of a supplied range of
+// values. The syntax of the function is:
+//
+// QUARTILE(array,quart)
+//
+func (fn *formulaFuncs) QUARTILE(argsList *list.List) formulaArg {
+ if argsList.Len() != 2 {
+ return newErrorFormulaArg(formulaErrorVALUE, "QUARTILE requires 2 arguments")
+ }
+ quart := argsList.Back().Value.(formulaArg).ToNumber()
+ if quart.Type != ArgNumber {
+ return quart
+ }
+ if quart.Number < 0 || quart.Number > 4 {
+ return newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
+ }
+ args := list.New().Init()
+ args.PushBack(argsList.Front().Value.(formulaArg))
+ args.PushBack(newNumberFormulaArg(quart.Number / 4))
+ return fn.PERCENTILE(args)
+}
+
+// QUARTILEdotINC function returns a requested quartile of a supplied range of
+// values. The syntax of the function is:
+//
+// QUARTILE.INC(array,quart)
+//
+func (fn *formulaFuncs) QUARTILEdotINC(argsList *list.List) formulaArg {
+ if argsList.Len() != 2 {
+ return newErrorFormulaArg(formulaErrorVALUE, "QUARTILE.INC requires 2 arguments")
+ }
+ return fn.QUARTILE(argsList)
+}
+
// SKEW function calculates the skewness of the distribution of a supplied set
// of values. The syntax of the function is:
//
diff --git a/calc_test.go b/calc_test.go
index 935b3c2..bce0c0f 100644
--- a/calc_test.go
+++ b/calc_test.go
@@ -692,6 +692,10 @@ func TestCalcCellValue(t *testing.T) {
// PERMUTATIONA
"=PERMUTATIONA(6,6)": "46656",
"=PERMUTATIONA(7,6)": "117649",
+ // QUARTILE
+ "=QUARTILE(A1:A4,2)": "1.5",
+ // QUARTILE.INC
+ "=QUARTILE.INC(A1:A4,0)": "0",
// SKEW
"=SKEW(1,2,3,4,3)": "-0.404796008910937",
"=SKEW(A1:B2)": "0",
@@ -1508,6 +1512,13 @@ func TestCalcCellValue(t *testing.T) {
"=PERMUTATIONA(0,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax",
"=PERMUTATIONA(-1,0)": "#N/A",
"=PERMUTATIONA(0,-1)": "#N/A",
+ // QUARTILE
+ "=QUARTILE()": "QUARTILE requires 2 arguments",
+ "=QUARTILE(A1:A4,\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax",
+ "=QUARTILE(A1:A4,-1)": "#NUM!",
+ "=QUARTILE(A1:A4,5)": "#NUM!",
+ // QUARTILE.INC
+ "=QUARTILE.INC()": "QUARTILE.INC requires 2 arguments",
// SKEW
"=SKEW()": "SKEW requires at least 1 argument",
"=SKEW(\"\")": "strconv.ParseFloat: parsing \"\": invalid syntax",