在C#中有没有办法检测字符串是否全部为大写?
大多数字符串都很短(即不超过100个字符)
答案 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
}
您可能想要通过字符大小写来节省内存中的字符
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