将所有第一个字母转换为大写,每个单词其余部分降低


110

我有一个需要转换的文本字符串(大部分为5-6个字)。

当前文本如下:

THIS IS MY TEXT RIGHT NOW

我想将其转换为:

This Is My Text Right Now

我可以遍历我的字符串集合,但是不确定如何执行此文本修改。

Answers:


251
string s = "THIS IS MY TEXT RIGHT NOW";

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

31
哈哈真的?那是那里?我喜欢.NET,但有些API设计师是真正的混蛋。
乔治·莫尔

7
请注意,虽然此方法可以执行发问者所要求的功能,但它是一种幼稚的算法,仅将每个单词大写,而无需考虑单词的种类。这并不是真正的“标题大小写”,因为标题大写的规则在不同的语言中有所不同。这甚至对英语也不正确。例如,标题“关于一个男孩”应为英语中的“关于一个男孩”,但是此方法将给出“关于一个男孩”。如果要使用真正的标题大小写,则必须编写自己的方法。
Ryan Lundy

18
我不会称他们为混蛋。“ ToTitleCase”的作用是它取决于文化,因此它必须位于System.Globalization命名空间中。完成CurrentThread只是为了获得当前的线程文化(请注意,如果用户具有不同的Locale,这可能会导致不同的行为!)。您也可以执行“ CultureInfo.InvariantCulture.TextInfo.ToTitleCase()”,因为InvariantCulture在所有区域性上的行为均相同,所以可能会更好。出于兴趣,乔治:您将把文化专用的字符串函数放在哪里?
Michael Stum

3
还要注意所有大写字符串的评论:msdn.microsoft.com/en-us/library/...
迈克尔葡萄汁

2
方法toLower()应该是ToLower(),方法的第一个字母以大写字母开头
-Alex

84

我可能更喜欢从CultureInfoSystem.Globalization)调用ToTitleCase而不是Thread.CurrentThreadSystem.Threading

string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

但它应该与jspcal解决方案相同

编辑

实际上,这些解决方案并不相同CurrentThread--calls-> CultureInfo


System.Threading.Thread.CurrentThread.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Threading.Thread.get_CurrentThread
IL_000B:  callvirt    System.Threading.Thread.get_CurrentCulture
IL_0010:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0015:  ldloc.0     // s
IL_0016:  callvirt    System.String.ToLower
IL_001B:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_0020:  stloc.0     // s

System.Globalization.CultureInfo.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Globalization.CultureInfo.get_CurrentCulture
IL_000B:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0010:  ldloc.0     // s
IL_0011:  callvirt    System.String.ToLower
IL_0016:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_001B:  stloc.0     // s

参考文献:


16

有两种方法可以将字符串的第一个字符转换为大写。

第一种方法是创建一个方法,该方法仅将第一个字符括起来,并使用子字符串附加字符串的其余部分:

public string UppercaseFirst(string s)
    {
        return char.ToUpper(s[0]) + s.Substring(1);
    }

第二种方法(稍快一点)是将字符串拆分为char数组,然后重新构建字符串:

public string UppercaseFirst(string s)
    {
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

1
该解决方案不能完全正确地回答问题。问题的标题是“将所有第一个字母都转换成大写,每个单词都变小”。但是,此解决方案仅将整个字符串的首字母大写。因此,此解决方案会将“ hello world”转换为“ Hello world”,而不是“ Hello World”。
brsfan '17

9

未经测试,但类似这样的东西应该起作用:

var phrase = "THIS IS MY TEXT RIGHT NOW";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w");
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant()));

本质上,它说“在所有出现的字母数字字符之后都进行正则表达式匹配,然后将其替换为自身的小写版本”


这也使所有大写单词都以大写字母开头,并以小写字母继续。正是我想要的。
M. Azyoksul

9

如果您在网页上使用,也可以使用CSS:

style="text-transform:capitalize;"


2
为什么要使用CSS?当问题要求使用c#asp.net正则表达式时
Jay

1
标签ASP.NET显示OP正在WEB上进行操作。当然,这不是问题的答案,因为OP需要解决方案,C#但它可以解决问题,并且可以作为替代解决方案。+1
穆罕默德·萨奇布'18

6

在构建大表时,需要考虑速度,因此Jamie Dixon的第二个功能是最好的,但是它并不能完全正常工作...

它无法将所有字母都转换为小写字母,并且仅将字符串的首字母大写,而不是字符串中每个单词的首字母...以下选项可解决这两个问题:

    public string UppercaseFirstEach(string s)
    {
        char[] a = s.ToLower().ToCharArray();

        for (int i = 0; i < a.Count(); i++ )
        {
            a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i];

        }

        return new string(a);
    }

尽管目前尚不确定这是否仍然是最快的选择,但Regex乔治·莫尔(George Mauer)提供的解决方案可能会更快...足够关心的人应该对其进行测试。


2
它有效,但我将此“ a.Count()”更改为a.Length
Christian

2

我不知道下面的解决方案是否比jspcal的解决方案有效或更有效,但是我敢肯定,与Jamie和George相比,它需要更少的对象创建。

string s = "THIS IS MY TEXT RIGHT NOW";
StringBuilder sb = new StringBuilder(s.Length);
bool capitalize = true;
foreach (char c in s) {
    sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c));
    capitalize = !Char.IsLetter(c);
}
return sb.ToString();

1
如果我们关心对象的创建,为什么不使用s上的for循环索引而不是使用StringBuilder来就地创建它呢?
jball

0

除了第一个答案外,请记住将字符串selectionstart索引更改为单词的末尾,否则您将获得字符串中字母的相反顺序。

s.SelectionStart=s.Length;

0

尝试这种技术;它返回期望的结果

CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());

并且不要忘记使用System.Globalization


0

您可能感兴趣的一种可能的解决方案。在一个循环中从右到左遍历一个字符数组,反之亦然。

public static string WordsToCapitalLetter(string value)
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            throw new ArgumentException("value");
        }

        int inputValueCharLength = value.Length;
        var valueAsCharArray = value.ToCharArray();

        int min = 0;
        int max = inputValueCharLength - 1;

        while (max > min)
        {
            char left = value[min];
            char previousLeft = (min == 0) ? left : value[min - 1];

            char right = value[max];
            char nextRight = (max == inputValueCharLength - 1) ? right : value[max - 1];

            if (char.IsLetter(left) && !char.IsUpper(left) && char.IsWhiteSpace(previousLeft))
            {
                valueAsCharArray[min] = char.ToUpper(left);
            }

            if (char.IsLetter(right) && !char.IsUpper(right) && char.IsWhiteSpace(nextRight))
            {
                valueAsCharArray[max] = char.ToUpper(right);
            }

            min++;
            max--;
        }

        return new string(valueAsCharArray);
    }

0

jspcal的答案作为字符串扩展名。

Program.cs

class Program
{
    static void Main(string[] args)
    {
        var myText = "MYTEXT";
        Console.WriteLine(myText.ToTitleCase()); //Mytext
    }
}

StringExtensions.cs

using System;
public static class StringExtensions
{

    public static string ToTitleCase(this string str)
    {
        if (str == null)
            return null;

        return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
    }
}
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.