diff options
author | xuri <xuri.me@gmail.com> | 2021-03-31 22:01:02 +0800 |
---|---|---|
committer | xuri <xuri.me@gmail.com> | 2021-03-31 22:01:02 +0800 |
commit | 9d4bf88b4700eeb5c50d4cc6efb0a2d73e5e8b7f (patch) | |
tree | 8e1124e7dc9470237d1aeb33fdb0ddeb712e7432 | |
parent | 2af96c07149e2b79a06375bdc735c0a8c1f6646e (diff) |
#65 fn: QUARTILE and QUARTILE.INC
-rw-r--r-- | calc.go | 36 | ||||
-rw-r--r-- | calc_test.go | 11 |
2 files changed, 47 insertions, 0 deletions
@@ -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", |