所以,我在验证货币和验证isbn号的实现方法上遇到了问题。我给出下面我的代码与总结描述。我相信有人能帮助我并解释我做错了什么。货币ISO验证
/// <summary>
/// Determines whether a specified string is a valid ISO currency symbol.
/// </summary>
/// <param name="currency">Currency string to check.</param>
/// <returns>
/// <see langword="true"/> if <paramref name="currency"/> is a valid ISO currency
symbol; <see langword="false"/> otherwise.
/// </returns>
/// <exception cref="ArgumentNullException">Thrown if currency is null.</exception>
public static bool IsValid(string? currency)
{
if (currency == null)
{
throw new ArgumentNullException(nameof(currency));
}
Regex regex = new Regex(@"^d*.?d?d?$");
bool y = regex.IsMatch(currency);
return y;
}
ISBN号验证
/// <summary>
/// Verifies if the string representation of number is a valid ISBN-10 or ISBN-13
identification number of book.
/// </summary>
/// <param name="isbn">The string representation of book's isbn.</param>
/// <returns>true if number is a valid ISBN-10 or ISBN-13 identification number of
book, false otherwise.</returns>
/// <exception cref="ArgumentNullException">Thrown if isbn is null.</exception>
public static bool IsValid(string? isbn)
{
if (isbn == null)
{
throw new ArgumentNullException(nameof(isbn));
}
int n = isbn.Length;
if (n != 10)
{
return false;
}
int sum = 0;
for (int i = 0; i < 9; i++)
{
int digit = isbn[i] - '0';
if (digit < 0 || digit > 9)
{
return false;
}
sum += digit * (10 - i);
}
char last = isbn[9];
if (last != 'X' && (last < '0'
|| last > '9'))
{
return false;
}
sum += (last == 'X') ? 10 :
(last - '0');
return sum % 11 == 0;
}
如果你能帮助我,我会很感激的。我不能决定它将是更好的解决使用正则表达式或不同的方法更复杂。我的解决方案不够好,所以我相信一些帮助或解释。
首先,你的方法都有相同的签名,因此在编译器看来是相同的,即使它们在相同的类/结构/记录中实现时,它们的参数名称不同。我建议给它们起更具体的名字,比如ValidCurrencyString
和ValidISBN
。
你也可能想要考虑不使用可空参数(因为你显然是在#nullable
上下文中),除非严格必要。
我理解你试图用你的方法来验证货币字符串,但它可能是最好的看看答案完全相同的问题,因为它是相当不必要的再写正则表达式。
public static bool ValidCurrencyString(string? str)
{
// If it is null, then it is not a valid string.
if (str is null) return false;
// Replace pattern with whichever regex suits you.
return Regex.IsMatch(str, pattern);
}
或者(最有可能)更好地提供启用#nullable
:
public static bool ValidCurrencyString(string str) => Regex.IsMatch(str, pattern);
验证ISBN不那么容易,但您可以(并且可能应该)也使用其他人已经编写的正则表达式。如果你决定这样做,这个方法也基本上看起来像ValidCurrencyString
加上另一个正则表达式。