public void DateValueWithInvalidArgumentReturnsPoundValue() { var func = new DateValue(); var args = FunctionsHelper.CreateArgs(); var result = func.Execute(args, this.ParsingContext); Assert.AreEqual(eErrorType.Value, ((ExcelErrorValue)result.Result).Type); }
public override CompileResult Execute(IEnumerable <FunctionArgument> arguments, ParsingContext context) { ValidateArguments(arguments, 1); var val = ArgToString(arguments, 0); double result = 0d; if (string.IsNullOrEmpty(val)) { return(CreateResult(result, DataType.Integer)); } val = val.TrimEnd(' '); bool isPercentage = false; if (val.EndsWith("%")) { val = val.TrimEnd('%'); isPercentage = true; } if (val.StartsWith("(") && val.EndsWith(")")) { var numCandidate = val.Substring(1, val.Length - 2); if (double.TryParse(numCandidate, NumberStyles.Any, _cultureInfo, out double tmp)) { val = "-" + numCandidate; } } if (Regex.IsMatch(val, $"^[\\d]*({Regex.Escape(_groupSeparator)}?[\\d]*)?({Regex.Escape(_decimalSeparator)}[\\d]*)*?[ ?% ?]?$", RegexOptions.Compiled)) { result = double.Parse(val, _cultureInfo); return(CreateResult(isPercentage ? result / 100 : result, DataType.Decimal)); } if (double.TryParse(val, NumberStyles.Float, _cultureInfo, out result)) { return(CreateResult(isPercentage ? result / 100d : result, DataType.Decimal)); } var timeSeparator = Regex.Escape(_timeSeparator); if (Regex.IsMatch(val, @"^[\d]{1,2}" + timeSeparator + @"[\d]{2}(" + timeSeparator + @"[\d]{2})?$", RegexOptions.Compiled)) { var timeResult = _timeValueFunc.Execute(val); if (timeResult.DataType == DataType.Date) { return(timeResult); } } var dateResult = _dateValueFunc.Execute(val); if (dateResult.DataType == DataType.Date) { return(dateResult); } return(CreateResult(ExcelErrorValue.Create(eErrorType.Value), DataType.ExcelError)); }
public override CompileResult Execute(IEnumerable <FunctionArgument> arguments, ParsingContext context) { ValidateArguments(arguments, 1); var val = ArgToString(arguments, 0); double result = 0d; if (string.IsNullOrEmpty(val)) { return(CreateResult(result, DataType.Integer)); } val = val.TrimEnd(' '); if (Regex.IsMatch(val, $"^[\\d]*({Regex.Escape(_groupSeparator)}?[\\d]*)?({Regex.Escape(_decimalSeparator)}[\\d]*)*?[ ?% ?]?$")) { if (val.EndsWith("%")) { val = val.TrimEnd('%'); result = double.Parse(val) / 100; } else { result = double.Parse(val); } return(CreateResult(result, DataType.Decimal)); } if (double.TryParse(val, NumberStyles.Float, CultureInfo.CurrentCulture, out result)) { return(CreateResult(result, DataType.Decimal)); } var timeSeparator = Regex.Escape(_timeSeparator); if (Regex.IsMatch(val, @"^[\d]{1,2}" + timeSeparator + @"[\d]{2}(" + timeSeparator + @"[\d]{2})?$")) { var timeResult = _timeValueFunc.Execute(val); if (timeResult.DataType == DataType.Date) { return(timeResult); } } var dateResult = _dateValueFunc.Execute(val); if (dateResult.DataType == DataType.Date) { return(dateResult); } return(CreateResult(ExcelErrorValue.Create(eErrorType.Value), DataType.ExcelError)); }
public void DateValueFunctionWithErrorValuesAsInputReturnsTheInputErrorValue() { var func = new DateValue(); var argNA = FunctionsHelper.CreateArgs(ExcelErrorValue.Create(eErrorType.NA)); var argNAME = FunctionsHelper.CreateArgs(ExcelErrorValue.Create(eErrorType.Name)); var argVALUE = FunctionsHelper.CreateArgs(ExcelErrorValue.Create(eErrorType.Value)); var argNUM = FunctionsHelper.CreateArgs(ExcelErrorValue.Create(eErrorType.Num)); var argDIV0 = FunctionsHelper.CreateArgs(ExcelErrorValue.Create(eErrorType.Div0)); var argREF = FunctionsHelper.CreateArgs(ExcelErrorValue.Create(eErrorType.Ref)); var resultNA = func.Execute(argNA, this.ParsingContext); var resultNAME = func.Execute(argNAME, this.ParsingContext); var resultVALUE = func.Execute(argVALUE, this.ParsingContext); var resultNUM = func.Execute(argNUM, this.ParsingContext); var resultDIV0 = func.Execute(argDIV0, this.ParsingContext); var resultREF = func.Execute(argREF, this.ParsingContext); Assert.AreEqual(eErrorType.NA, ((ExcelErrorValue)resultNA.Result).Type); Assert.AreEqual(eErrorType.Name, ((ExcelErrorValue)resultNAME.Result).Type); Assert.AreEqual(eErrorType.Value, ((ExcelErrorValue)resultVALUE.Result).Type); Assert.AreEqual(eErrorType.Num, ((ExcelErrorValue)resultNUM.Result).Type); Assert.AreEqual(eErrorType.Div0, ((ExcelErrorValue)resultDIV0.Result).Type); Assert.AreEqual(eErrorType.Ref, ((ExcelErrorValue)resultREF.Result).Type); }