字符串是否全部为CAP

在C#中,有没有一种方法可以检测字符串是否全部大写?

大多数字符串都较短(即100个字符以下)

StubbornMule asked 2020-01-22T19:21:12Z
11个解决方案
92 votes

无需创建新字符串:

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

    return true;
}

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

   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;
    }
Greg Dean answered 2020-01-22T19:21:25Z
75 votes

我喜欢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);
Jon Skeet answered 2020-01-22T19:22:02Z
55 votes

简单?

if (input.ToUpper() == input)
{
    // string is all upper
}
BoltBait answered 2020-01-22T19:22:22Z
14 votes

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

.Net中的ToUpper()是一种语言操作。 在某些语言中,大写规则并不简单明了。 土耳其语我为此而闻名。

// 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对此警告

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

上面的代码引入了一个错误。 某些非英语“字母”需要两个.net字符进行编码(一个替代对)。 您必须检测这些对并将它们大写为单个单元。

另外,如果您省略区域性信息以获取语言上的大写字母,那么您还会引入一个错误,即在某些语言环境中,您的家庭酿造大写算法与该语言环境的.net算法不一致。

当然,如果您的代码永远不会在讲英语的语言环境之外运行,也永远不会收到非英语文本,那么这些都不重要。

Ifeanyi Echeruo answered 2020-01-22T19:23:14Z
7 votes

采用

if (input == input.ToUpper())
M4N answered 2020-01-22T19:23:33Z
6 votes

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

return s.Equals(s.ToUpper())

Nick answered 2020-01-22T19:23:58Z
4 votes

如果需要良好的性能,我假设它经常发生。 如果是这样,请采用您的解决方案,并执行数百万次并确定时间。 我怀疑您所拥有的要比其他解决方案好,因为您没有创建必须清理的新的垃圾收集对象,并且无论如何都无法遍历字符串,因此无法复制该字符串。

Joe answered 2020-01-22T19:24:18Z
1 votes

另一种方法

return input.Equals(input.ToUpper(), StringComparison.Ordinal)
Eduardo Miranda answered 2020-01-22T19:24:38Z
1 votes

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

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

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

  • C1_DEFINED(0x0001):大写
  • C1_DEFINED(0x0002):小写
  • C1_DEFINED(0x0004):十进制数字
  • C1_DEFINED(0x0008):空格字符
  • C1_DEFINED(0x0010):标点
  • C1_DEFINED(0x0020):控制字符
  • C1_DEFINED(0x0040):空白字符
  • C1_DEFINED(0x0080):十六进制数字
  • C1_DEFINED(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 |   |   |   |   |   |   |   |   |   |   |   |
Ian Boyd answered 2020-01-22T19:26:09Z
0 votes

我认为以下几点:

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

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

Leandro López answered 2020-01-22T19:26:33Z
0 votes

正则表达式浮现在脑海。 在那里找到了这个:[http://en.csharp-online.net/Check_if_all_upper_case_string]

PEZ answered 2020-01-22T19:26:53Z
translate from https://stackoverflow.com:/questions/448206/detecting-if-a-string-is-all-caps