将字符串格式化为标题大小写

30
20个回答

16

以下是在C#中实现此操作的简单静态方法:

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}

2
不支持Silverlight。请查看其他C#答案。 - Simon_Weaver
13
如果这不是有史以来最长的资格要求……顺便提一下今天的新闻(如果你愿意)。 - Thanatos
2
请注意,如果起始字符串全是大写,你必须先调用 String.ToLower,因为 ToTitleCase 不能处理全是大写的字符串。 - Hans Olsson
1
如果您正在使用当前文化,那么它如何保持不变? - Matthew Flaschen

13

在可能引起吹毛求疵者愤怒的情况下,自动将所有空格前面的单词转换为大写字母应谨慎。

对于像冠词和连词这样的例外情况,我至少会考虑实现一个词典。看这里:

“美女与野兽”

而且当涉及到专有名词时,事情变得更加复杂难懂。


10

8

如果你想将它转换为C语言,可以使用ASCII代码(http://www.asciitable.com/)查找字符的整数值并从中减去32。

如果您计划接受a-z和A-Z之外的字符,则此方法不是很好。

例如:ASCII 134:å,ASCII 143:Å。
使用算术运算得到:ASCII 102:f

使用库调用,不要假设您可以对字符使用整数算术运算以获取有用的结果。Unicode 很棘手


6
在Silverlight中,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();
        });
    }

这太棒了!终于有些“简单”的东西可以在LightSwitch中使用。然而,有一个小问题。这实际上是Proper Case,而不是Title Case。你能想到一种简单的方法来排除像“a”、“the”等的单词吗?Proper Case: This Is A Test Sentence Title Case: This is a Test Sentence - Yann Duran
抱歉,无法使用“ ”产生新行。 - Yann Duran

5
在Java中,您可以使用以下代码。
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);
}

5

用什么语言?

在PHP中,它是:

ucwords()

示例:

$HelloWorld = ucwords('hello world');

5

在Perl中:

$string =~ s/(\w+)/\u\L$1/g;

那甚至在常见问题解答中都有提到。

它不再出现在常见问题解答中,因为它是错误的。想想这对缩略词有什么影响 :) - brian d foy

5
如果您使用的语言有支持的方法/函数,则只需使用该方法(如C#中的ToTitleCase方法)。
如果没有,则需要执行以下操作:
1.读取字符串。 2.获取第一个单词。 3.将该单词的首字母大写1。 4.继续查找下一个单词。 5.如果没有到达字符串末尾,则返回步骤3,否则退出。 1要在C中将其大写,可以使用ASCII码查找字符的整数值并从中减去32。
代码中需要进行更多错误检查(确保有效字母等),并且“Capitalize”函数需要对字母施加某种“标题大小写方案”,以检查不需要大写的单词(如“and”,“but”等)。 这里是一个好的方案。

完全不适用于像德语这样的代码表,其中umlauts(äöü)具有不遵循该模式的大写字母。 - xmjx

4

类似于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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接