Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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);
        }