Exemple #1
0
        public RangeGroup GetRanges()
        {
            if (string.IsNullOrEmpty(Text) || !Text.Contains("#{"))
            {
                return(null);
            }

            var matches = RangeRegexp.Matches(Text);

            if (matches.Count == 0)
            {
                return(null);
            }

            if (matches.Count > 1)
            {
                throw new DeveloperException("В одном поле не должно быть более одного 'range'");
            }

            var match = matches[0];

            var res = new RangeGroup();

            res.ExpressionText = match.Value;

            var nameMatch = match.Groups["name"];

            if (nameMatch.Success)
            {
                res.Name = nameMatch.Value;
            }

            var rangesMatch = match.Groups["ranges"];

            if (!rangesMatch.Success)
            {
                throw new DeveloperException(string.Format("Невозможно прочитать диапазоны в выражении '{0}'", Text));
            }

            // вычисляем диапазоны
            var values = rangesMatch.Value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            var ranges = new Range[values.Length];

            try
            {
                for (int i = 0; i < values.Length; i++)
                {
                    var rangeIdx = values[i].IndexOf('-');
                    if (rangeIdx == -1)
                    {
                        var idx = int.Parse(values[i]);
                        ranges[i] = new Range(idx, idx);
                    }
                    else
                    {
                        var left  = int.Parse(values[i].Substring(0, rangeIdx));
                        var right = int.Parse(values[i].Substring(rangeIdx + 1));
                        ranges[i] = new Range(left, right);
                    }
                }
            }
            catch (FormatException ex)
            {
                throw new Exception(string.Format("Неправильный формат в формуле '{0}'.", res.ExpressionText), ex);
            }

            res.Ranges.AddRange(ranges);
            return(res);
        }
Exemple #2
0
 public void SetRangeValue(RangeGroup rangeGroup, string value)
 {
     Text = Text.Replace(rangeGroup.ExpressionText, value);
 }