問題
最近有個需求要將化學運算式字串算出它的分子量是多少,例如,
1 | CaCO3 => 100.0869 |
解法
為什麼 CaCO3 的分子量是 100.0869 呢?
可以從Molecular Weight Calculator發現,
它是Calcium(40.078)
+ Carbon(12.0107)
+ Oxygen(15.9994)*3
,
所以總共分子量是 40.078 + 12.0107 + 47.9982
= 100.0869
處理拆分成四步
- 找出運算式中的變數(CO2, CaCO3 …)
- 計算出這些變數的值(加總)
- 指定將運算式中變數的值
- 計算出運算式的結果
1.找出運算式中的變數,可透過ncalc的Expression.Compile
來幫忙,
1 | var ec = Expression.Compile(expression, false); |
1 | internal class ParameterExtractionVisitor : LogicalExpressionVisitor |
2.計算出這些變數的值(加總),可以透過正則表達式匹配元素及其數量,並計算出分子量總和
1 | double CalcMolecularFormulaMass(string formula) |
然後建立元素分子量對應表,讓CalcMolecularFormulaMass
可以取到每個元素的分子量,
1 | private static IReadOnlyDictionary<string, double> _MolecularWeights |
3.指定將運算式中變數的值及 4.計算出運算式的結果,可以再透過ncalc的Expression
來幫忙,
1 | var e = new Expression(ec); |
以上的內容筆者已放到 Nuget 之中,可以安裝MolecularWeightCalculator套件,直接使用即可。
1 | var molecularMath = new MolecularMath(); |
程式碼放請參考MolecularWeightCalculator Source
參考資源
MolecularWeightCalculator Source
Molecular Weight Calculator
ncalc
IUPAC_Periodic_Table_150-04May22.jpg
一尺青天,蓋一尺土: 每個人都有自己的天地,每個人都有自己的生活方式