private IEnumerable<IFormulaToken> InterpretNumbers(IEnumerable<IFormulaToken> tokens, IEnumerable<IFormulaToken> lookAhead)
{
var decimalSeparator = CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator;
var numberTokens = new List<IFormulaToken>();
var sbValue = new StringBuilder();
var containsDecimalSeparator = false;
var lookAhead2 = lookAhead.GetEnumerator();
foreach (var token in tokens)
{
// yield any non-number token
var numberToken = token as IFormulaNumber;
if (numberToken == null)
{
yield return token;
continue;
}
// append digit
var digitToken = numberToken as FormulaNodeNumber;
if (digitToken != null)
{
numberTokens.Add(numberToken);
sbValue.Append(digitToken.Value.ToString("R", CultureInfo.InvariantCulture));
}
// append decimal separator
var decimalSeparatorToken = numberToken as FormulaTokenDecimalSeparator;
if (decimalSeparatorToken != null)
{
if (containsDecimalSeparator)
{
SetParsingError(numberToken, AppResourcesHelper.Get("FormulaInterpreter_Number_DoubleDecimalSeparator"));
yield break;
}
numberTokens.Add(numberToken);
sbValue.Append(decimalSeparator);
containsDecimalSeparator = true;
}
// advance lookAhead parallel to tokens
var newIndex = GetOrigin(numberToken).End;
var nextToken = lookAhead2.FirstOrDefault(token2 => GetOrigin(token2).Start == newIndex);
// yield common number of value tokens
if (nextToken is IFormulaNumber) continue;
FormulaTree commonToken;
if (numberTokens.Count == 1)
{
if (containsDecimalSeparator)
{
SetParsingError(numberTokens[0], AppResourcesHelper.Get("FormulaInterpreter_Number_SingleDecimalSeparator"));
yield break;
}
commonToken = (FormulaTree) numberTokens[0];
}
else
{
// parse value
double value;
if (!double.TryParse(sbValue.ToString(), NumberStyles.Number, CultureInfo.InvariantCulture, out value))
{
SetParsingError(GetOrigin(numberTokens), AppResourcesHelper.Get("FormulaInterpreter_Number_Overflow"));
yield break;
}
commonToken = FormulaTreeFactory.CreateNumberNode(value);
SetOrigin(commonToken, GetOrigin(numberTokens));
}
yield return commonToken;
numberTokens.Clear();
sbValue.Clear();
containsDecimalSeparator = false;
}
}