【问题标题】:Replace exponential values to double in mathematical expression将指数值替换为数学表达式中的两倍
【发布时间】:2014-01-09 10:03:58
【问题描述】:

我需要检查一个数学表达式是否包含指数值,然后将指数值替换为十进制值。

输入:“10993.657030812325*8.20681165367255E-05”

输出:“10993.657030812325*0.0000820681165367255”

我面临的复杂性是在数学表达式中检测它。

检测我拥有的正则表达式的正则表达式是:

(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)?

但是,对于整个表达式匹配 true,是否有直接的方法来解决这个问题,或者我是否必须将其分解并单独检查。

【问题讨论】:

  • 你为什么要为此使用正则表达式?无论如何,您可以使用正则表达式来匹配它,然后执行自定义代码来转换它。我确信 .NET 正则表达式库有一个可以调用回调的替换函数。
  • @ThiefMaster:请启发,还能怎么做,我也愿意接受非正则表达式解决方案
  • @ThiefMaster 我想看看它是否有效! (是的,你是对的,it does。)
  • 看来,Regex 是用格式化的浮点值替换浮点值的工具。

标签: c# .net regex evaluation expression-evaluation


【解决方案1】:

如果指数不是太大(小于 99),您可以 使用此代码:

  String formula = "10993.657030812325*8.20681165367255E-05";
  String pattern = @"(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)"; 

  // Let's change format of each double precision in the formula:
  String result = Regex.Replace(formula, pattern, (match) => {
    // Simple formating; may be you should use more elaborated one
    Double db = Double.Parse(match.Value, CultureInfo.InvariantCulture);
    // Now, you should format out the Double db:
    // First eliminate exponent (F99 is the maximum possible; F100 won't do) 
    String St = db.ToString("F99", CultureInfo.InvariantCulture);

    // Next eliminate trailing '0' 
    if (St.IndexOf('.') >= 0)
      St = St.TrimEnd('0');

    return St.TrimEnd('.'); 
  });

结果是“10993.6570308123*0.0000820681165367255”

【讨论】:

  • 我不会为此使用double。例如,31.0000000000000480*31.0000000000000480E-05 变为 31.0000000000001*0.00031
  • 略有改善;现在是31.00000000000005*0.0003100000000000004999 中的 R99 也是 ignored
  • @Rawling:我明白了,你说得很对:为了准确地完成这项工作,我必须实现一个对字符串进行格式化的例程,而不是在 Double 上
  • @Dmitry 您可以使用decimal 获得最多 28-29 位数字,但是是的,除此之外,它还必须是字符串处理...有趣 :)
  • @Rauld:对不起,“F99”是正确的格式,而不是“R99”最简单的解决方案。 Rawling 提到的正确例程应该基于没有 Double 的字符串格式
猜你喜欢
  • 2020-12-15
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多