如何在字符串前后拆分字符串并将其转换为表达式?

时间:2017-04-18 07:23:25

标签: c# .net winforms console-application

有一些动态表达式,它们是字符串格式。那么如何在表达式之前和之后分离字符串并对其中的每个子表达式执行一些操作呢?我需要单独的每个子表达式的值和最后的十进制数。不确定如何在表达式之前和之后分隔字符串。

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;

1 个答案:

答案 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 

如果您希望使用abc将结果格式化为公式 ...(正如您所说的那样)它在问题中):

  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