Estoy tratando de analizar una fórmula química (en el formato, por ejemplo: Al2O3
o O3
o C
o C11H22O12
) en C# desde una cadena. Funciona bien a menos que haya solo un átomo de un elemento particular (por ejemplo, el átomo de oxígeno en H2O
). ¿Cómo puedo solucionar ese problema y, además, hay una forma mejor de analizar una cadena de fórmula química que lo que estoy haciendo?Analizando una fórmula química a partir de una cadena en C#?
ChemicalElement es una clase que representa un elemento químico. Tiene propiedades AtomicNumber (int), Name (string), Symbol (string). ChemicalFormulaComponent es una clase que representa un elemento químico y un recuento de átomos (por ejemplo, parte de una fórmula). Tiene propiedades Element (ChemicalElement), AtomCount (int).
El resto debe ser lo suficientemente claro como para entenderlo (espero) pero hágamelo saber con un comentario si puedo aclarar algo, antes de contestar.
Aquí está mi código actual:
/// <summary>
/// Parses a chemical formula from a string.
/// </summary>
/// <param name="chemicalFormula">The string to parse.</param>
/// <exception cref="FormatException">The chemical formula was in an invalid format.</exception>
public static Collection<ChemicalFormulaComponent> FormulaFromString(string chemicalFormula)
{
Collection<ChemicalFormulaComponent> formula = new Collection<ChemicalFormulaComponent>();
string nameBuffer = string.Empty;
int countBuffer = 0;
for (int i = 0; i < chemicalFormula.Length; i++)
{
char c = chemicalFormula[i];
if (!char.IsLetterOrDigit(c) || !char.IsUpper(chemicalFormula, 0))
{
throw new FormatException("Input string was in an incorrect format.");
}
else if (char.IsUpper(c))
{
// Add the chemical element and its atom count
if (countBuffer > 0)
{
formula.Add(new ChemicalFormulaComponent(ChemicalElement.ElementFromSymbol(nameBuffer), countBuffer));
// Reset
nameBuffer = string.Empty;
countBuffer = 0;
}
nameBuffer += c;
}
else if (char.IsLower(c))
{
nameBuffer += c;
}
else if (char.IsDigit(c))
{
if (countBuffer == 0)
{
countBuffer = c - '0';
}
else
{
countBuffer = (countBuffer * 10) + (c - '0');
}
}
}
return formula;
}
¿Por qué estás mirando si el primer carácter de la fórmula es mayúscula en cada iteración del 'for' loop ('! char.IsUpper (chemicalFormula, 0)')? El índice aquí siempre es '0'. –
Creo que su función también tiene problemas con algo como C4O2 ¿es esto cierto? –
Vea también la página http://stackoverflow.com/questions/2974362/parsing-a-chemical-formula/3742985. Pide uno en Java, con una respuesta en Python, y enlaces a soluciones ANTLR y Python más complejas. –