簡體   English   中英

遞歸檢查字符串中的所有字母是否都是大寫

[英]Check if all the letters in a string are capital recursively

我必須檢查遞歸中的所有字母是否都是大寫字母,我不知道為什么這不起作用:

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"));

謝謝。

您正在嘗試將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;

我假設您嘗試使用int.Parse(str[0].ToString())來獲取 ASCII 值。

你需要使用的是這個(int)str[0]

解析將嘗試將字符串轉換為數字,因此值為“412”的字符串將被解析為值為 412 的整數。

我必須檢查是否所有字母都是遞歸的大寫字母

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;
}

要單獨解決異常,請不要解析字符串。 您可以直接將char與任何ushort值進行比較。

換句話說,這是一個有效的檢查(沒有字符串解析)

str[0] > 65

AsciiTable.com應該向您展示為什么您的檢查會在邊緣處失敗。

還要考慮...

  • 不是字母的字符。
  • IsCapital(null)

最后,可能使這更容易(假設繞過非字母)的方法是創建一個bool IsNotLowerCase(char c)的方法。

注意——這些都假設為 ASCII,正如我的鏈接所證明的那樣。

如果你必須支持完整的 Unicode,希望你可以使用char的方法

我認為,這種數字比較是行不通的。

首先,即使所有字母都是大寫,它也會為像“ABC123”這樣的字符串返回 false。 其次,有許多國家字符不屬於 65..90 范圍,即使它們是大寫字母。 你應該(如果可以的話)使用一些 Char 方法http://msdn.microsoft.com/en-us/library/d1x97616.aspx

雖然有很多方法可以給這只貓換皮,但我更喜歡將此類代碼包裝到可重用的擴展方法中,這樣可以讓以后的工作變得微不足道。 使用擴展方法時,您還可以避免使用 RegEx,因為它比直接字符檢查慢。 我喜歡使用 Extensions.cs NuGet 包中的擴展。 它使此檢查變得如此簡單:

  1. 將 [https://www.nuget.org/packages/Extensions.cs][1] 包添加到您的項目中。
  2. 將“ using Extensions; ”添加到代碼的頂部。
  3. "smith".IsUpper()將返回 False,而"SMITH".IsUpper()將返回 True。 4. 其余代碼中的所有其他檢查都只是MyString.IsUpper()

您的示例代碼將變得如此簡單:

using Extensions;

//Console.WriteLine(IsCapital("abc"));
Console.WriteLine("abc".IsUpper());
public static bool IsCapital(string str)
{
 return !Regex.IsMatch(str, "[a..z]");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM