Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中查找指数格式的字符串值?_C#_Wpf_String_Number Formatting_Exponential - Fatal编程技术网

如何在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);
}