检测字符串是否全部是CAPS

时间:2009-01-15 19:52:06

标签: c# string

在C#中有没有办法检测字符串是否全部为大写?

大多数字符串都很短(即不超过100个字符)

11 个答案:

答案 0 :(得分:88)

无需创建新字符串:

bool IsAllUpper(string input)
{
    for (int i = 0; i < input.Length; i++)
    {
        if (!Char.IsUpper(input[i]))
             return false;
    }

    return true;
}

编辑:如果您想跳过非字母字符( OP的原始实现没有,但他/她的评论表明他们可能想要):< / p>

   bool IsAllUpper(string input)
    {
        for (int i = 0; i < input.Length; i++)
        {
            if (Char.IsLetter(input[i]) && !Char.IsUpper(input[i]))
                return false;
        }
        return true;
    }

答案 1 :(得分:72)

我喜欢LINQ方法。

如果您想将其限制为所有大写字母(即没有空格等):

return input.All(c => char.IsUpper(c));

或使用方法组转换:

return input.All(char.IsUpper);

如果您想禁止使用小写字母:

return !input.Any(c => char.IsLower(c));

return !input.Any(char.IsLower);

答案 2 :(得分:56)

简单?

if (input.ToUpper() == input)
{
    // string is all upper
}

答案 3 :(得分:14)

确保您的大写定义匹配.Nets定义大写。

<。> .Net中的ToUpper()是一种语言操作。在某些语言中,大写规则并不是直截了当的。 Turkish I is famous for this

// Meaning of ToUpper is linguistic and depends on what locale this executes
// This test could pass or fail in ways that surprise you.
if (input.ToUpper() == input) 
{
    // string is all upper
}

您可以使用

// Meaning of ToUpper is basically 'ASCII' ToUpper no matter the locale.
if (input.ToUpper(CultureInfo.InvariantCulture) == input) 
{
    // string is all upper
}

您可能想要通过字符大小写来节省内存中的字符

MSDN cautions against this

for(int i = 0; i < input.Length; i++) {
   if(input[i] != Char.ToUpper(input[i], CultureInfo.InvariantCulture)) {
     return false;
   }
}

上面的代码介绍了一个错误。一些非英语'字母'需要两个.net字符来编码(代理对)。您必须检测这些对并将它们作为一个单元进行大写。

此外,如果您省略了文化信息以获得语言大写,那么您将引入一个错误,在某些区域设置中,您的家庭酿造大写算法不同意该区域设置的.net算法。

当然,如果您的代码永远不会在英语区域之外运行或从不接收非英语文本,那么这一切都不重要。

答案 4 :(得分:8)

使用

if (input == input.ToUpper())

答案 5 :(得分:7)

我会将字符串转换为所有大写字母(ToUpper),然后将其与原始大写字母进行比较(使用Equals)。应该可以在一行代码中使用。

return s.Equals(s.ToUpper())

答案 6 :(得分:4)

如果这需要有良好的性能,我认为它发生了很多。如果是这样,请采取您的解决方案,并做几百万次并计时。我怀疑你得到的东西比其他解决方案更好,因为你没有创建一个必须清理的新的垃圾收集对象,并且你不能复制一个字符串而不用迭代它。

答案 7 :(得分:1)

另一种方法

return input.Equals(input.ToUpper(), StringComparison.Ordinal)

答案 8 :(得分:1)

您还可以调用Windows函数,该函数告诉您字符串的构成。

GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, s, s.Length, ref characterTypes);

您为它提供一个UInt16数组,该数组的长度与字符串相同,并且用标志的按位组合填充每个元素:

  • C1_UPPER(0x0001):大写
  • C1_LOWER(0x0002):小写
  • C1_DIGIT(0x0004):十进制数字
  • C1_SPACE(0x0008):空格字符
  • C1_PUNCT(0x0010):标点符号
  • C1_CNTRL(0x0020):控制字符
  • C1_BLANK(0x0040):空白字符
  • C1_XDIGIT(0x0080):十六进制数字
  • C1_ALPHA(0x0100):任何语言字符:字母,音节或表意字符。有些字符可以是字母,而不能大写或小写
  • C1_DEFINED(0x0200):已定义的字符,但不是其他C1_ ​​类型之一

因此,如果您检查了字符串:

  

你好,“ 42”!

您会得到结果

  

[0x210、0x301、0x382、0x302、0x302、0x302、0x210、0x248、0x210、0x284、0x284、0x210、0x210]

其中细分为:

|            | H | e | l | l | o | , |   | " | 4 | 2 | " | ! |
|------------|---|---|---|---|---|---|---|---|---|---|---|---|
| Defined    | X | X | X | X | X | X | X | X | X | X | X | X |
| Alpha      | x | x | x | x | x |   |   |   |   |   |   |   |
| XDigit     |   | x |   |   |   |   |   |   | x | x |   |   |
| Blank      |   |   |   |   |   |   | x |   |   |   |   |   |
| Cntrl      |   |   |   |   |   |   |   |   |   |   |   |   |
| Punct      |   |   |   |   |   | x |   |   |   |   | x | x |
| Space      |   |   |   |   |   |   | x |   |   |   |   |   |
| Digit      |   |   |   |   |   |   |   |   | x | x |   |   |
| Lower      |   | x | x | x | x |   |   |   |   |   |   |   |
| Upper      | x |   |   |   |   |   |   |   |   |   |   |   |

答案 9 :(得分:0)

我认为如下:

bool equals = (String.Compare(input, input.ToUpper(), StringComparison.Ordinal) == 0)

也可以工作,你可以确保在不考虑字符串大小的情况下进行比较(我认为VB.NET默认忽略大小写)。甚至使用String.CompareOrdinal(input, input.ToUpper())

答案 10 :(得分:0)

我想到了正则表达式。在那里找到了这个:http://en.csharp-online.net/Check_if_all_upper_case_string