如何在C#中查找指数格式的字符串值?
我想知道字符串是否具有指数格式。目前我正在检查如下如何在C#中查找指数格式的字符串值?,c#,wpf,string,number-formatting,exponential,C#,Wpf,String,Number Formatting,Exponential,我想知道字符串是否具有指数格式。目前我正在检查如下 var s = "1.23E+04"; var hasExponential = s.Contains("E"); 但我知道这不是正确的方法。所以,有谁能为我的要求提供正确、最快的方法吗?尝试使用正则表达式 string s = "1.23E+04"; string pattern = @"^\d{1}.\d+(E\+)\d+$"; Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase)
var s = "1.23E+04";
var hasExponential = s.Contains("E");
但我知道这不是正确的方法。所以,有谁能为我的要求提供正确、最快的方法吗?尝试使用正则表达式
string s = "1.23E+04";
string pattern = @"^\d{1}.\d+(E\+)\d+$";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
bool hasExponential = rgx.IsMatch(s);
如果您还想确保它真的是一个数字,而不仅仅是一个带有“E”的字符串,那么像这样的函数可能会有所帮助。逻辑仍然很简单
private bool IsExponentialFormat(string str)
{
double dummy;
return (str.Contains("E") || str.Contains("e")) && double.TryParse(str, out dummy);
}
您可以随时在
e
上拆分。或者使用double.TryParse
。两种方法都很有效。(我敢打赌,parseExponental2
对于有效的函数更快,而parseExponental1
对于无效的函数更快。)
并增加了以下方法:
private static bool IsExponentialFormat(string str)
{
double dummy;
return (str.Contains("E") || str.Contains("e")) && double.TryParse(str, out dummy);
}
@Grantwiney,如果它是指数形式,我想使用另一个变量中的另一个值。当我们使用正则表达式时,性能应该受到影响。所以,您能告诉性能有效的方法吗?@Selvamz性能总是受到影响,不要因为您认为这可能会影响您的解决方案而拒绝它,这可能不会影响您的解决方案。@Bas此方法的执行速度是sstan方法的两倍,或者是我提到的第二种方法的两倍。@EBrown但与同时运行的任何算法相比,它可能是你总数的0.001或0.002runtime@Bas如果OP关注性能,那么这是一个无关的声明。运行时的哪一部分并不重要,如果OP想要最快的算法,这不是它。
e-
和e-
也是有效的。这就是聪明到连一微秒都拿不到的问题。简单确保了正确性,而正确性应该始终是首要任务。@sstan啊,是的,我忘记了消极因素。我将进行更改。另外,您正在通过拆分创建一组新字符串。Regex比那快多了。@Bas你有没有做过基准测试?如果不是,则该语句无效。我刚刚用钳形标记了它,Regex
选项的速度与string选项相同,是非string选项的两倍。尝试使用RegexOptions.Compiled
string[] exponentials = new string[] { "1.23E+4", "1.23E+04", "1.23e+4", "1.23", "1.23e+4e+4", "abce+def", "1.23E-04" };
Stopwatch sw = new Stopwatch();
sw.Start();
for (int round = 0; round < 100000; round++)
for (int i = 0; i < exponentials.Length; i++)
ParseExponential1(exponentials[i]);
sw.Stop();
Console.WriteLine("Benchmark 1 (ParseExponential1) complete: {0}ms", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int round = 0; round < 100000; round++)
for (int i = 0; i < exponentials.Length; i++)
ParseExponential2(exponentials[i]);
sw.Stop();
Console.WriteLine("Benchmark 2 (ParseExponential2) complete: {0}ms", sw.ElapsedMilliseconds);
sw.Reset();
string pattern = @"^\d{1}.\d+(E\+)\d+$";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
sw.Start();
for (int round = 0; round < 100000; round++)
for (int i = 0; i < exponentials.Length; i++)
rgx.IsMatch(exponentials[i]);
sw.Stop();
Console.WriteLine("Benchmark 3 (Regex Parse) complete: {0}ms", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int round = 0; round < 100000; round++)
for (int i = 0; i < exponentials.Length; i++)
IsExponentialFormat(exponentials[i]);
sw.Stop();
Console.WriteLine("Benchmark 4 (IsExponentialFormat) complete: {0}ms", sw.ElapsedMilliseconds);
sw.Start();
for (int round = 0; round < 100000; round++)
for (int i = 0; i < exponentials.Length; i++)
ParseExponential3(exponentials[i]);
sw.Stop();
Console.WriteLine("Benchmark 5 (ParseExponential3) complete: {0}ms", sw.ElapsedMilliseconds);
private static bool IsExponentialFormat(string str)
{
double dummy;
return (str.Contains("E") || str.Contains("e")) && double.TryParse(str, out dummy);
}