private static Dictionary<Tuple<string, string>, double> parseString(string f, CultureInfo culture)
{
f = f.Replace("*", String.Empty).Replace(" ", String.Empty);
var terms = new Dictionary<Tuple<string, string>, double>();
Regex replaceQuad = new Regex(@"([a-zA-Z])(²)");
f = replaceQuad.Replace(f, "$1$1");
string separator = culture.NumberFormat.NumberDecimalSeparator;
Regex r = new Regex(@"[\-\+]?[\s]*((\d*\" + separator + @"{0,1}\d+)|[a-zA-Z][²]?)+");
Regex number = new Regex(@"\d*\" + separator + @"{0,1}\d+");
Regex symbol = new Regex(@"[a-zA-Z]");
MatchCollection matches = r.Matches(f, 0);
foreach (Match m in matches)
{
string term = m.Value;
double scalar = (term[0] == '-') ? -1 : 1;
// Extract value
MatchCollection coeff = number.Matches(term);
foreach (Match c in coeff)
scalar *= Double.Parse(c.Value, culture);
// Extract symbols
MatchCollection symbols = symbol.Matches(term);
if (symbols.Count == 1)
terms.Add(Tuple.Create(symbols[0].Value, (string)null), scalar);
else if (symbols.Count == 2)
terms.Add(Tuple.Create(symbols[0].Value, symbols[1].Value), scalar);
else
terms.Add(Tuple.Create((string)null, (string)null), scalar);
}
return terms;
}