簡體   English   中英

將所有第一個字母轉換為大寫,每個單詞的其余部分都較低

[英]Convert all first letter to upper case, rest lower for each word

我有一串文本(大部分大約 5-6 個單詞)需要轉換。

目前文本看起來像:

THIS IS MY TEXT RIGHT NOW

我想將其轉換為:

This Is My Text Right Now

我可以遍歷我的字符串集合,但我不確定如何執行此文本修改。

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

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

我可能更喜歡從CultureInfo ( System.Globalization ) 調用ToTitleCase而不是Thread.CurrentThread ( System.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

參考資料:

有幾種方法可以將字符串的第一個字符轉換為大寫。

第一種方法是創建一個方法,該方法簡單地限制第一個字符並使用子字符串附加字符串的其余部分:

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

第二種方法(稍微快一點)是將字符串拆分為字符數組,然后重建字符串:

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

如果你在網頁上使用,你也可以使用 CSS:

style="text-transform:capitalize;"

未經測試,但這樣的事情應該工作:

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

從本質上講,它說“對跟隨另一個字母數字字符的所有字母數字字符進行正則表達式匹配,然后將其替換為自身的小寫版本”

在構建大表時,速度是一個問題,因此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);
    }

雖然在這一點上,這是否仍然是最快的選擇是不確定的。 George Mauer提供的Regex解決方案可能會更快......足夠關心的人應該測試它。

我不知道下面的解決方案是否比jspcal 的答案更有效,但我很確定它需要比JamieGeorge 的更少的對象創建。

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

除了第一個答案,記住將字符串 selectionstart 索引更改為單詞的末尾,否則您將獲得字符串中字母的相反順序。

s.SelectionStart = s.Length;

試試這個技巧; 它返回所需的結果

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

並且不要忘記使用System.Globalization

這是您可能感興趣的可能解決方案之一。在一個循環中從右到左遍歷字符數組,反之亦然。

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

jspcal 的答案作為字符串擴展。

文件程序.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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM