有一些动态表达式,它们是字符串格式。那么如何在表达式之前和之后分离字符串并对其中的每个子表达式执行一些操作呢?我需要单独的每个子表达式的值和最后的十进制数。不确定如何在表达式之前和之后分隔字符串。
install.packages("readr")
我在替换后获得的最终表达是 4 * 12 + 8 + 5/16 + 20 * 12 + 8 + 13/16
但是如何分割如下的值并获得精确的十进制值:
a =(4 * 12 + 8)
b =(5/16)
c =(20 * 12 + 8 + 13/16)
d = a + b + c;
答案 0 :(得分:2)
我建议首先 Split
和然后 Replace
:
string text = "4'-8\"x5/16\"x20'-8 13/16";
string[] items = text
.Split('x')
.Select(item => item
.Replace("'", "*12")
.Replace("-", "+")
.Replace("x", "+")
.Replace(" ", "+")
.Replace(@"""", ""))
.ToArray();
测试:
Console.Write(string.Join(Environment.NewLine, items));
结果:
4*12+8
5/16
20*12+8+13/16
如果您希望使用a
,b
,c
将结果格式化为公式 ...(正如您所说的那样)它在问题中):
string[] items = text
.Split('x')
.Select(item => item
.Replace("'", "*12")
.Replace("-", "+")
.Replace("x", "+")
.Replace(" ", "+")
.Replace(@"""", ""))
.Select((v, i) => $"{(char)('a' + i)} = ({v})")
.ToArray();
string formula =
string.Join(Environment.NewLine, items) + Environment.NewLine +
$"{(char) ('a' + items.Length)} = " +
string.Join(" + ", Enumerable.Range('a', items.Length).Select(c => $"{(char) (c)}"));
Console.Write(formula);
结果:
a = (4*12+8)
b = (5/16)
c = (20*12+8+13/16)
d = a + b + c
最后,你提到了
每个子表达式的值分别为最终十进制数
对于简单公式,您可以尝试DataTable.Compute:
string formula;
using (DataTable dt = new DataTable()) {
string[] items = text
.Split('x')
.Select(item => item
.Replace("'", "*12")
.Replace("-", "+")
.Replace("x", "+")
.Replace(" ", "+")
.Replace(@"""", ""))
.ToArray();
formula =
string.Join(Environment.NewLine, items
.Select((v, i) => $"{(char) ('a' + i)} = ({v}) = {dt.Compute(v, null)}")) +
Environment.NewLine +
$"{(char) ('a' + items.Length)} = " +
string.Join(" + ", Enumerable.Range('a', items.Length).Select(c => $"{(char) (c)}")) +
$" = {items.Sum(item => Convert.ToDecimal(dt.Compute(item, null)))}";
}
Console.Write(formula);
结果:
a = (4*12+8) = 56
b = (5/16) = 0.3125
c = (20*12+8+13/16) = 248.8125
d = a + b + c = 305.1250