Skip to content

Commit 01ea0ad

Browse files
author
linzhijun
committed
fix
1 parent 5f10c73 commit 01ea0ad

File tree

2 files changed

+11
-17
lines changed

2 files changed

+11
-17
lines changed

csharp/ToolGood.Algorithm/Internals/Functions/FunctionBase.sum.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -482,21 +482,16 @@ public override void ToString(StringBuilder stringBuilder, bool addBrackets)
482482
}
483483
}
484484

485-
internal class Function_PERCENTRANK : Function_N
485+
internal class Function_PERCENTRANK : Function_3
486486
{
487-
public Function_PERCENTRANK(FunctionBase[] funcs) : base(funcs)
487+
public Function_PERCENTRANK(FunctionBase func1, FunctionBase func2, FunctionBase func3) : base(func1, func2, func3)
488488
{
489489
}
490490

491491
public override Operand Calculate(AlgorithmEngine work)
492492
{
493-
var args = new List<Operand>();
494-
foreach (var item in funcs) { var aa = item.Calculate(work); if (aa.IsError) { return aa; } args.Add(aa); }
495-
496-
var args1 = args[0].ToArray("Function '{0}' parameter {1} is error!", "PercentRank", 1);
497-
if (args1.IsError) { return args1; }
498-
var args2 = args[1].ToNumber("Function '{0}' parameter {1} is error!", "PercentRank", 2);
499-
if (args2.IsError) { return args2; }
493+
var args1 = func1.Calculate(work); if (args1.Type != OperandType.ARRARY) { args1 = args1.ToArray("Function '{0}' parameter {1} is error!", "PercentRank", 1); if (args1.IsError) { return args1; } }
494+
var args2 = func2.Calculate(work); if (args2.Type != OperandType.NUMBER) { args2 = args2.ToNumber("Function '{0}' parameter {1} is error!", "PercentRank", 2); if (args2.IsError) { return args2; } }
500495

501496
List<decimal> list = new List<decimal>();
502497
var o = FunctionUtil.F_base_GetList(args1, list);
@@ -505,9 +500,8 @@ public override Operand Calculate(AlgorithmEngine work)
505500
var k = args2.NumberValue;
506501
var v = ExcelFunctions.PercentRank(list.Select(q => (double)q).ToArray(), (double)k);
507502
var d = 3;
508-
if (args.Count == 3) {
509-
var args3 = args[2].ToNumber("Function '{0}' parameter {1} is error!", "PercentRank", 3);
510-
if (args3.IsError) { return args3; }
503+
if (func3!=null) {
504+
var args3 = func2.Calculate(work); if (args3.Type != OperandType.NUMBER) { args3 = args3.ToNumber("Function '{0}' parameter {1} is error!", "PercentRank", 3); if (args3.IsError) { return args3; } }
511505
d = args3.IntValue;
512506
}
513507
return Operand.Create(Math.Round(v, d, MidpointRounding.AwayFromZero));

csharp/ToolGood.Algorithm/Internals/MathFunctionVisitor.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,11 +1224,11 @@ public FunctionBase VisitPERCENTILE_fun(mathParser.PERCENTILE_funContext context
12241224
public FunctionBase VisitPERCENTRANK_fun(mathParser.PERCENTRANK_funContext context)
12251225
{
12261226
var exprs = context.expr();
1227-
FunctionBase[] args = new FunctionBase[exprs.Length];
1228-
for (int i = 0; i < exprs.Length; i++) {
1229-
args[i] = exprs[i].Accept(this);
1230-
}
1231-
return new Function_PERCENTRANK(args);
1227+
var args1 = exprs[0].Accept(this);
1228+
var args2 = exprs[1].Accept(this);
1229+
if (exprs.Length == 2) return new Function_PERCENTRANK(args1, args2, null);
1230+
var args3 = exprs[2].Accept(this);
1231+
return new Function_PERCENTRANK(args1, args2, args3);
12321232
}
12331233

12341234
public FunctionBase VisitAVERAGE_fun(mathParser.AVERAGE_funContext context)

0 commit comments

Comments
 (0)