我必须检查递归中所有字母是否都是大写字母,我不知道为什么这不起作用:
public static bool IsCapital(string str)
{
if (str.Length == 1)
return int.Parse(str[0].ToString()) > 65 && int.Parse(str[0].ToString()) < 90;
return IsCapital(str.Substring(1)) && int.Parse(str[0].ToString()) > 65 && int.Parse(str[0].ToString()) < 90;
}
它崩溃并说:“未处理的异常:System.FormatException:输入字符串的格式不正确。”
Console.WriteLine(IsCapital("abc"));
感谢。
答案 0 :(得分:1)
您尝试将char
解析为int
,而不是将其转换为int
。
你正在做的是接受一个字母,例如A
,并将其解析为int。 A不是任何数字,因此解析失败。
您要做的是将char显式转换为int以获取您正在寻找的ASCII值:
if (str.Length == 1)
{
return ((int)str[0]) > 65
&& ((int)str[0]) < 90;
}
return IsCapital(str.Substring(1))
&& ((int)str[0]) > 65
&& ((int)str[0]) < 90;
答案 1 :(得分:1)
我假设您尝试使用int.Parse(str[0].ToString())
来获取ASCII值。
您需要使用的是(int)str[0]
解析将尝试将字符串转换为数字,因此值为“412”的字符串将被解析为值为412的int。
答案 2 :(得分:1)
我必须检查递归中所有字母是否都是大写字母
public static bool IsCapital(string str)
{
if (String.IsNullOrEmpty(str)) return false;
if (str.Length == 1 && char.IsUpper(str[0])) return true;
return char.IsUpper(str[0]) ? IsCapital(str.Substring(1)) :false;
}
答案 3 :(得分:1)
要仅解决异常,请不要解析字符串。您可以直接将char
与任意ushort
值进行比较。
换句话说,这是一个有效的检查(没有字符串解析)
str[0] > 65
AsciiTable.com应该告诉你为什么你的支票会在边缘失败。
还要考虑......
IsCapital(null)
最后,可能使这更容易的事情(假设绕过非字母)是创建一个bool IsNotLowerCase(char c)
行的方法。
注意 - 这些都是ASCII,我的链接就是明证。
如果您必须支持完整的Unicode,希望您可以使用methods of char
。
答案 4 :(得分:0)
我认为,这个数字比较是行不通的。
首先,即使所有字母都是大写字母,它也会像“ABC123”一样返回false。第二,即使它们是首都,也有许多国家角色不属于65..90。你应该(如果可以的话)使用一些Char方法 http://msdn.microsoft.com/en-us/library/d1x97616.aspx
答案 5 :(得分:0)
虽然有很多方法可以给这只猫剥皮,但我更喜欢将这些代码包装到可重用的扩展方法中,这样以后的工作就变得微不足道了。使用扩展方法时,您还可以避免使用 RegEx,因为它比直接字符检查慢。我喜欢使用 Extensions.cs NuGet 包中的扩展。它使这项检查变得如此简单:
using Extensions;
”。"smith".IsUpper()
将返回 False 而 "SMITH".IsUpper()
将返回 True。 4. 其余代码中的所有其他检查都只是MyString.IsUpper()
。您的示例代码将变得如此简单:
using Extensions;
//Console.WriteLine(IsCapital("abc"));
Console.WriteLine("abc".IsUpper());
答案 6 :(得分:-3)
public static bool IsCapital(string str)
{
return !Regex.IsMatch(str, "[a..z]");
}