C# 检查一个字符串是否是科学计数法格式字符串 如 1.229266E+01
在 C# 中,要检查一个字符串是否是科学计数法格式,你可以使用正则表达式(Regex
)来匹配该格式。科学计数法格式通常形如 ±a.bcdef...e±x
或 ±aE±x
,其中 a
是非零数字,bcdef...
是可选的小数部分,x
是指数部分。
以下是一个示例代码,展示了如何使用正则表达式来检查字符串是否符合科学计数法的格式,包括提供的示例 1.229266E+01
:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string[] testStrings = {
"1.229266E+01",
"-3.14E-2",
"2.71E3",
"6.022E23",
"123", // Not scientific notation
"1.23.45E6", // Invalid format
"1.23e", // Incomplete exponent
"e42", // Missing number before exponent
"1.23x10^4" // Not scientific notation, uses 'x' instead of 'e' or 'E'
};
foreach (var str in testStrings)
{
bool isScientific = IsScientificNotation(str);
Console.WriteLine($"{str} is scientific notation: {isScientific}");
}
}
static bool IsScientificNotation(string input)
{
// 正则表达式匹配科学计数法格式
// ^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?$
// ^ - 字符串开始
// [-+]? - 可选的正负号
// \d+ - 一个或多个数字(非零,但正则表达式无法强制这一点,需要在逻辑中额外处理)
// (\.\d+)? - 可选的小数部分(一个点和一个或多个数字)
// ([eE] - 'e' 或 'E' 表示指数开始
// [-+]?\d+ - 可选的正负号和一个或多个数字表示指数
// )? - 指数部分是可选的
// $ - 字符串结束
// 注意:这个正则表达式不会强制数字部分不以0开头(除非它是整个数字,如0.123e4是有效的),
// 也不会强制小数点后至少有一位数字(如1e4是有效的科学计数法)。
// 如果需要更严格的验证,正则表达式可以进一步复杂化。
// 但是,对于大多数用途来说,下面的正则表达式应该足够了,并且它会匹配你提供的示例。
string pattern = @"^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?$";
Regex regex = new Regex(pattern);
// 使用正则表达式匹配输入字符串
Match match = regex.Match(input);
// 检查是否匹配,并且数字部分不是以0开头(除非它是整个数字,如0.123e4)
// 注意:这个检查不是完美的,因为它允许如001.23e4这样的字符串(尽管它们不是有效的科学计数法),
// 但对于大多数实际应用来说可能已经足够了。如果需要更严格的检查,请考虑使用额外的逻辑来处理。
if (match.Success)
{
// 检查数字部分是否不以0开头(除非它是整个字符串,并且可能是0.xxx的形式)
if (input[0] == '0' && input.Length > 1 && input[1] != '.')
{
// 如果第一个字符是0,并且后面不是小数点,则不是有效的科学计数法(除非它是0.xxx的形式)
// 但是,由于我们已经匹配了小数点后的数字(如果有的话),所以这里只需要检查不是单独的0
// 并且不是0后面紧跟非小数点字符的情况。单独的0(如0e4)实际上是有效的科学计数法,表示0。
// 因此,这个检查主要是为了排除像0123e4这样的字符串。
return false;
}
// 如果通过了所有检查,则认为是有效的科学计数法格式
return true;
}
// 如果不匹配正则表达式,则不是有效的科学计数法格式
return false;
}
}
然而,上面的代码中有一个额外的检查,它试图排除以0开头的数字部分(除非它是0.xxx的形式)。这个检查实际上是不必要的,并且可能会导致一些有效的科学计数法字符串被拒绝(比如0.001E3
,它实际上等于1
)。在科学计数法中,数字部分可以是以0开头的,只要它不是一个单独的0(除非后面跟着小数点)。
因此,可以简化IsScientificNotation
方法,去掉那个额外的检查,只保留正则表达式的匹配:
static bool IsScientificNotation(string input)
{
string pattern = @"^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?$";
Regex regex = new Regex(pattern);
return regex.IsMatch(input);
}
这样,上面的代码将正确地匹配提供的示例1.229266E+01
以及其他有效的科学计数法字符串。