如何用C#将每个单词的第一个字符或整个字符串的第一个字符大写?

时间:2009-05-26 22:28:13

标签: c# string humanize

我可以编写自己的算法来做到这一点,但我觉得在C#中应该等同于ruby's humanize

我用Google搜索,但只找到了将日期人性化的方法。

示例:

  • 将“Lorem Lipsum Et”变成“Lorem lipsum et”的方法
  • 将“Lorem lipsum et”变成“Lorem Lipsum Et”的方法

9 个答案:

答案 0 :(得分:108)

正如@miguel's answer的评论中所讨论的,您可以使用自.NET 1.1以来可用的TextInfo.ToTitleCase。以下是与您的示例相对应的一些代码:

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“)。

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

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 

答案 1 :(得分:28)

使用正则表达式看起来更清晰:

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

答案 2 :(得分:13)

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

在专家的静态类中定义函数ToTitleCase

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 !"

答案 3 :(得分:2)

如果您只想将第一个字符大写,请将其粘贴在您自己的实用方法中:

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

还有一种库方法可以将每个单词的第一个字符大写:

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

答案 4 :(得分:1)

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

上述大部分内容都是可以接受的,但是如果您有需要保留的混合大小写单词,或者如果您想使用真正的标题大小写,例如:

,它们都不能解决发生的问题。

"在美国学习PHd课程的地点"

" 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;
    }

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

如果你想保持像#34; a&#34;等小字的大小写。 &#34;&#34;&#34;然后只需从特殊情况字符串数组中删除它们。不同的组织对资本化有不同的规则。

您可以在此网站上看到此代码的示例:Egg Donation London - 此网站通过解析网址自动在页面顶部创建面包屑路径,例如&#34; / services / uk-egg -bank /导入&#34; - 然后路径中的每个文件夹名称都用空格替换连字符并将文件夹名称大写,因此uk-egg-bank成为英国蛋库。 (保留大写&#39;英国&#39;)

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

答案 5 :(得分:0)

据我所知,如果不编写代码(或者编写代码),就没有办法做到这一点。 C#网(哈!)你上,下和标题(你有什么)案例:

http://support.microsoft.com/kb/312890/EN-US/

答案 6 :(得分:0)

.NET中没有适当的语言资本化的预构建解决方案。你想要什么样的资本化?您是否遵循芝加哥风格手册大会? AMA或MLA?即使是简单的英语句子大写也有1000个特殊例外。我不能谈论红宝石的人性化,但我想它可能不遵循语言规则的大写,而是做一些更简单的事情。

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

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

答案 7 :(得分:0)

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

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();
}

答案 8 :(得分:0)

我已经使用自定义扩展方法实现了同样的效果。对于第一个字母的第一个字母,请使用方法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.