如何使用C#大写每个单词的首字符或整个字符串的首字符?


76

我可以编写自己的算法来做到这一点,但我觉得应该等效于C#中的ruby人性化

我用谷歌搜索,但只找到人性化日期的方法。

例子:

  • 一种将“ Lorem Lipsum Et”转换为“ Lorem Lipum et”的方法
  • 一种将“ Lorem Lipum et”转换为“ Lorem Lipsum Et”的方法

1
我喜欢出于某种原因说Lorem Lipsum ^^
marcgg

3
总有正则表达式!字符串strToCap = strSource.ToLower(); Regex rCapitalize = new Regex(“(?<= [!\。?] \ s +)[A-Za-z]”); strToCap = rCapitalize.Replace(strToCap,m => {return m.Value.ToUpper();}); ...但是您将遇到两个问题。:)
rijipooh

3
由于接受的答案链接到的代码与原始问题的要求相反,因此我对问题进行了双向编辑,以希望以后遇到该问题的用户不会完全感到困惑。 。
丹尼尔·艾威克

尽管可能不是由OP的示例字符串引起的,但许多人正在失去标题大小写和大写字母之间的区别。标题区分大小写不会大写常用词,因此即使在上面可以使用,也是错误的解决方案。狗快与狗快。后者是大写。
demongolem '18

Answers:


133

@miguel答案的注释中所述,您可以使用TextInfo.ToTitleCase.NET 1.1以来可用的功能。这是与您的示例相对应的一些代码:

string lipsum1 = "Lorem lipsum et";

// Creates a TextInfo based on the "en-US" culture.
TextInfo textInfo = new CultureInfo("en-US",false).TextInfo;

// Changes a string to titlecase.
Console.WriteLine("\"{0}\" to titlecase: {1}", 
                  lipsum1, 
                  textInfo.ToTitleCase( lipsum1 )); 

// Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et

它将忽略全部为大写的大写字母,例如“ LOREM LIPSUM ET”,因为它会处理首字母缩写词在文本中的情况(以使“ NAMBLA ”不会成为“ nambla”或“ Nambla”)。

但是,如果您只想大写第一个字符,则可以执行此处的解决方案……或者您可以拆分字符串并大写列表中的第一个字符:

string lipsum2 = "Lorem Lipsum Et";

string lipsum2lower = textInfo.ToLower(lipsum2);

string[] lipsum2split = lipsum2lower.Split(' ');

bool first = true;

foreach (string s in lipsum2split)
{
    if (first)
    {
        Console.Write("{0} ", textInfo.ToTitleCase(s));
        first = false;
    }
    else
    {
        Console.Write("{0} ", s);
    }
}

// Will output: Lorem lipsum et 

怎么会有更多的人对此一无所知。这是一种出色的内置方法,谢谢
Coops 2012年

6
哈哈3年后的今天,NAMBLA仍然让我发笑,哦,我为ToTitleCase()+1
杰森·库拉通

2
ToTitleCase 1st的发现问题将成为1St。
智者酸奶[

1
发现了ToTitleCase的第二个问题-&nbsp; 将成为&Nbsp;
Brain2000

2
@ Brain2000如果您知道字符串中包含HTML实体,则应在使用之前让您的代码进行处理ToTitleCase
Spoike

33

使用正则表达式可以使它看起来更简洁:

string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());

1
扩展答案:字符串s =“在懒惰的狗上快速认出狐狸”;s = Regex.Replace(s.ToLower(),@“(^ \ w)|(\ s \ w)”,m => m.Value.ToUpper());
mcandal

8
这一行式非正则表达式也适用:s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value.ToLower());
罗伯托

2
@Roberto-“ hEm”-> regex =“ HEm”; “ hEm”-> TitleCase =“ Hem”
zzxyz

我认为这更简单Regex.Replace(s, @"\b([a-z])", m => m.Value.ToUpper())
John Henckel

27

还有另一个优雅的解决方案:

ToTitleCase在projet的静态类中定义函数

using System.Globalization;

public static string ToTitleCase(this string title)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title.ToLower()); 
}

然后在项目的任何位置将其用作字符串扩展名:

"have a good day !".ToTitleCase() // "Have A Good Day !"

1
您还应该在使用title.ToLower()前使用ToTitleCase。否则大写字母将不会被替换。
RA。

优雅的solutioin,对我来说很好,谢谢!
LuckyLuke82

2

如果只想大写第一个字符,只需将其放在自己的实用程序方法中即可:

return string.IsNullOrEmpty(str) 
    ? str
    : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();

还有一个库方法可以将每个单词的首字母大写:

http://msdn.microsoft.com/zh-CN/library/system.globalization.textinfo.totitlecase.aspx


那只会给您标题案例:“ Lorem Ipsum Et”,而不是句子案例:“ Lorem ipsum et”,对吗?
温尼

我认为相反。
Çağdaş特勤

我当时在想,但是ToTitleCase与OP想要的相反。
Pat Hermens,2009年

我不好,我认为这会起作用,但是没有。Titlecase似乎可以解决问题
marcgg

嗯...标题是什么?您是说ToTitleCase吗?它与您最初要求的相反。另外,这是我在原始答案中发布的第一件事。我放弃。
Daniel Earwicker,2009年

1

CSS技术是可以的,但只能更改浏览器中字符串的表示形式。更好的方法是在发送到浏览器之前使文本本身大写。

上面的大多数暗示都是可以的,但是如果您混合使用需要保留的大小写单词,或者您想使用真正的标题大小写,则上述任何一种含义都无法解决,例如:

“在美国哪里学习博士学位课程”

要么

“ IRS表格UB40a”

同样使用CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string)保留大写单词,如在“体育和MLB棒球”中一样,该单词变为“体育和MLB棒球”,但是如果将整个字符串都放在大写中,则会引起问题。

因此,我整理了一个简单的函数,通过将它们包含在specialCases和lowerCases字符串数组中,可以使大写字母和大小写混合的单词保持小写(如果它们不在短语的开头和结尾)为小写:

public static string TitleCase(string value) {
        string titleString = ""; // destination string, this will be returned by function
        if (!String.IsNullOrEmpty(value)) {
            string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title
            string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title
            string[] words = value.ToLower().Split(' ');
            bool wordAdded = false; // flag to confirm whether this word appears in special case list
            int counter = 1;
            foreach (string s in words) {

                // check if word appears in lower case list
                foreach (string lcWord in lowerCases) {
                    if (s.ToLower() == lcWord) {
                        // if lower case word is the first or last word of the title then it still needs capital so skip this bit.
                        if (counter == 0 || counter == words.Length) { break; };
                        titleString += lcWord;
                        wordAdded = true;
                        break;
                    }
                }

                // check if word appears in special case list
                foreach (string scWord in specialCases) {
                    if (s.ToUpper() == scWord.ToUpper()) {
                        titleString += scWord;
                        wordAdded = true;
                        break;
                    }
                }

                if (!wordAdded) { // word does not appear in special cases or lower cases, so capitalise first letter and add to destination string
                    titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower();
                }
                wordAdded = false;

                if (counter < words.Length) {
                    titleString += " "; //dont forget to add spaces back in again!
                }
                counter++;
            }
        }
        return titleString;
    }

这只是一种快速而简单的方法-如果您想花更多的时间,可能会有所改进。

如果要保留较小的单词(例如“ a”和“ of”)的大写字母,则只需将它们从特殊情况的字符串数组中删除。不同的组织在资本化方面有不同的规则。

您可以在以下站点上看到此代码的示例:伦敦鸡蛋捐赠-该站点通过解析url(例如“ / services / uk-egg-bank / introduction”)在页面顶部自动创建面包屑跟踪-然后每个路径中的文件夹名称用连字符替换为空格并大写了文件夹名称,因此uk-egg-bank成为UK Egg Bank。(保留大写的“ UK”)

此代码的扩展可能是在共享文本文件,数据库表或Web服务中具有一个首字母缩略词和大写/小写单词的查找表,以便可以从一个位置维护混合大小写单词的列表,并将其应用于许多不同的位置依赖该功能的应用程序。


1

所有这些示例似乎都使其他字符降低了,这不是我所需要的。

customerName= CustomerName<-我想要的是

this is an example = This Is An Example

public static string ToUpperEveryWord(this string s)
{
    // Check for empty string.  
    if (string.IsNullOrEmpty(s))
    {
        return string.Empty;
    }

    var words = s.Split(' ');

    var t = "";
    foreach (var word in words)
    {
        t += char.ToUpper(word[0]) + word.Substring(1) + ' ';
    }
    return t.Trim();
}

0

.NET中没有针对适当的语言大写化的预构建解决方案。您要进行什么样的资本化?您是否遵循《芝加哥手册手册》惯例?AMA或MLA?甚至普通英语句子的大写字母也有1000个单词的特殊例外。我无法谈及ruby的人性化功能,但我想它可能不遵循大写的语言规则,而做的事情要简单得多。

在内部,我们遇到了同样的问题,并且不得不编写大量的代码来处理适当的(在我们这个小世界中)文章标题,甚至不考虑句子的大写。它的确确实变得“模糊” :)

这实际上取决于您的需要-为什么要尝试将句子转换为适当的大写字母(以及在什么情况下)?


0

使用自定义扩展方法已经实现了相同的目的。对于First子字符串的First Letter,请使用method yourString.ToFirstLetterUpper()。对于不包含文章和某些命题的每个子字符串的首字母,请使用方法yourString.ToAllFirstLetterInUpper()。下面是一个控制台程序:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("this is my string".ToAllFirstLetterInUpper());
            Console.WriteLine("uniVersity of lonDon".ToAllFirstLetterInUpper());
        }
    }

    public static class StringExtension
    {
        public static string ToAllFirstLetterInUpper(this string str)
        {
            var array = str.Split(" ");

            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] == "" || array[i] == " " || listOfArticles_Prepositions().Contains(array[i])) continue;
                array[i] = array[i].ToFirstLetterUpper();
            }
            return string.Join(" ", array);
        }

        private static string ToFirstLetterUpper(this string str)
        {
            return str?.First().ToString().ToUpper() + str?.Substring(1).ToLower();
        }

        private static string[] listOfArticles_Prepositions()
        {
            return new[]
            {
                "in","on","to","of","and","or","for","a","an","is"
            };
        }
    }

输出值

This is My String
University of London
Process finished with exit code 0.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.