我该如何将一个字符串格式化为标题大小写?
以下是在C#中实现此操作的简单静态方法:
public static string ToTitleCaseInvariant(string targetString)
{
return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}
在可能引起吹毛求疵者愤怒的情况下,自动将所有空格前面的单词转换为大写字母应谨慎。
对于像冠词和连词这样的例外情况,我至少会考虑实现一个词典。看这里:
“美女与野兽”
而且当涉及到专有名词时,事情变得更加复杂难懂。
以下是解决此问题的Perl方案http://daringfireball.net/2008/05/title_case
以下是解决此问题的Ruby方案http://frankschmitt.org/projects/title-case
以下是解决此问题的Ruby单行代码方案:http://snippets.dzone.com/posts/show/4702
'some string here'.gsub(/\b\w/){$&.upcase}
这个单行命令所做的是使用正则表达式替换每个单词的第一个字符为大写形式。
如果你想将它转换为C语言,可以使用ASCII代码(http://www.asciitable.com/)查找字符的整数值并从中减去32。
如果您计划接受a-z和A-Z之外的字符,则此方法不是很好。
例如:ASCII 134:å,ASCII 143:Å。
使用算术运算得到:ASCII 102:f
使用库调用,不要假设您可以对字符使用整数算术运算以获取有用的结果。Unicode 很棘手。
TextInfo
类中没有ToTitleCase
方法。
以下是一种简单的基于正则表达式的方法。
注意:Silverlight没有预编译的正则表达式,但对我来说,这种性能损失并不是一个问题。
public string TitleCase(string str)
{
return Regex.Replace(str, @"\w+", (m) =>
{
string tmp = m.Value;
return char.ToUpper(tmp[0]) + tmp.Substring(1, tmp.Length - 1).ToLower();
});
}
public String titleCase(String str) {
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (i == 0) {
chars[i] = Character.toUpperCase(chars[i]);
} else if ((i + 1) < chars.length && chars[i] == ' ') {
chars[i + 1] = Character.toUpperCase(chars[i + 1]);
}
}
return new String(chars);
}
在Perl中:
$string =~ s/(\w+)/\u\L$1/g;
类似于Excel的PROPER函数:
public static string ExcelProper(string s) {
bool upper_needed = true;
string result = "";
foreach (char c in s) {
bool is_letter = Char.IsLetter(c);
if (is_letter)
if (upper_needed)
result += Char.ToUpper(c);
else
result += Char.ToLower(c);
else
result += c;
upper_needed = !is_letter;
}
return result;
}
String.ToLower
,因为ToTitleCase
不能处理全是大写的字符串。 - Hans Olsson