web-dev-qa-db-fra.com

Conversion de chaîne en titre

J'ai une chaîne qui contient des mots dans un mélange de majuscules et de minuscules. 

Par exemple: string myData = "a Simple string";

Je dois convertir le premier caractère de chaque mot (séparé par des espaces) en majuscules. Donc, je veux que le résultat soit: string myData ="A Simple String";

Y at-il un moyen facile de faire cela? Je ne veux pas diviser la chaîne et faire la conversion (ce sera mon dernier recours). En outre, il est garanti que les chaînes sont en anglais.

258
Naveen

MSDN: TextInfo.ToTitleCase

Assurez-vous d'inclure: using System.Globalization

string title = "war and peace";

TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

title = textInfo.ToTitleCase(title); 
Console.WriteLine(title) ; //War And Peace

//When text is ALL UPPERCASE...
title = "WAR AND PEACE" ;

title = textInfo.ToTitleCase(title); 
Console.WriteLine(title) ; //WAR AND PEACE

//You need to call ToLower to make it work
title = textInfo.ToTitleCase(title.ToLower()); 
Console.WriteLine(title) ; //War And Peace
470
Kobi

Essaye ça:

string myText = "a Simple string";

string asTitleCase =
    System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
    ToTitleCase(myText.ToLower());

Comme cela a déjà été souligné, l'utilisation de TextInfo.ToTitleCase peut ne pas vous donner les résultats exacts que vous souhaitez. Si vous avez besoin de plus de contrôle sur la sortie, vous pouvez faire quelque chose comme ceci:

IEnumerable<char> CharsToTitleCase(string s)
{
    bool newWord = true;
    foreach(char c in s)
    {
        if(newWord) { yield return Char.ToUpper(c); newWord = false; }
        else yield return Char.ToLower(c);
        if(c==' ') newWord = true;
    }
}

Et puis utilisez-le comme ceci:

var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );
129
Winston Smith

Encore une autre variation. Sur la base de plusieurs astuces ici, je l’ai réduite à cette méthode d’extension qui convient parfaitement à mes besoins:

public static string ToTitleCase(this string s) =>
    CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());
55
Todd Menier

Personnellement, j’ai essayé la méthode TextInfo.ToTitleCase, mais je ne comprends pas pourquoi cela ne fonctionne pas lorsque tous les caractères sont en majuscule.

Bien que j'aime la fonction util fournie par Winston Smith , laissez-moi vous fournir la fonction que j'utilise actuellement:

public static String TitleCaseString(String s)
{
    if (s == null) return s;

    String[] words = s.Split(' ');
    for (int i = 0; i < words.Length; i++)
    {
        if (words[i].Length == 0) continue;

        Char firstChar = Char.ToUpper(words[i][0]); 
        String rest = "";
        if (words[i].Length > 1)
        {
            rest = words[i].Substring(1).ToLower();
        }
        words[i] = firstChar + rest;
    }
    return String.Join(" ", words);
}

Jouer avec certaines chaînes tests:

String ts1 = "Converting string to title case in C#";
String ts2 = "C";
String ts3 = "";
String ts4 = "   ";
String ts5 = null;

Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts1)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts2)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts3)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts4)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts5)));

Donner output:

|Converting String To Title Case In C#|
|C|
||
|   |
||
23
Luis Quijada

Récemment, j'ai trouvé une meilleure solution. 

Si votre texte contient chaque lettre en majuscule, alors TextInfo ne le convertira pas en bon cas. Nous pouvons résoudre ce problème en utilisant la fonction minuscule à l'intérieur comme ceci:

public static string ConvertTo_ProperCase(string text)
{
    TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
    return myTI.ToTitleCase(text.ToLower());
}

Maintenant, cela convertira tout ce qui vient en Propercase.

18
Binod
public static string PropCase(string strText)
{
    return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}
15
Rajesh

Si quelqu'un est intéressé par la solution pour Compact Framework:

return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());
7
Mibou

Voici la solution à ce problème ...

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(txt);
6
Jade

Utilisez d'abord ToLower(), puis CultureInfo.CurrentCulture.TextInfo.ToTitleCase sur le résultat pour obtenir le résultat correct.

    //---------------------------------------------------------------
    // Get title case of a string (every Word with leading upper case,
    //                             the rest is lower case)
    //    i.e: ABCD EFG -> Abcd Efg,
    //         john doe -> John Doe,
    //         miXEd CaSING - > Mixed Casing
    //---------------------------------------------------------------
    public static string ToTitleCase(string str)
    {
        return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
    }
5
DDan

Il vaut mieux comprendre en essayant votre propre code ...

Lire la suite 

http://www.stupidcodes.com/2014/04/convert-string-to-uppercase-proper-case.html

1) Convertir une chaîne en majuscule

string lower = "converted from lowercase";
Console.WriteLine(lower.ToUpper());

2) Convertir une chaîne en minuscule

string upper = "CONVERTED FROM UPPERCASE";
Console.WriteLine(upper.ToLower());

3) Convertir une chaîne en TitleCase

    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    string txt = textInfo.ToTitleCase(TextBox1.Text());
2
Sunil Acharya

J'avais besoin d'un moyen de gérer les mots en majuscules et j'aimais la solution de Ricky AH, mais je l'ai poussé plus loin pour la mettre en œuvre comme méthode d'extension. Cela évite d'avoir à créer votre tableau de caractères, puis à appeler ToArray explicitement à chaque fois - vous pouvez donc simplement l'appeler sur la chaîne, comme suit:

usage:

string newString = oldString.ToProper();

code:

public static class StringExtensions
{
    public static string ToProper(this string s)
    {
        return new string(s.CharsToTitleCase().ToArray());
    }

    public static IEnumerable<char> CharsToTitleCase(this string s)
    {
        bool newWord = true;
        foreach (char c in s)
        {
            if (newWord) { yield return Char.ToUpper(c); newWord = false; }
            else yield return Char.ToLower(c);
            if (c == ' ') newWord = true;
        }
    }

}
2
Adam Diament

Voici une implémentation, caractère par caractère. Devrait travailler avec "(One Two Three)"

public static string ToInitcap(this string str)
{
    if (string.IsNullOrEmpty(str))
        return str;
    char[] charArray = new char[str.Length];
    bool newWord = true;
    for (int i = 0; i < str.Length; ++i)
    {
        Char currentChar = str[i];
        if (Char.IsLetter(currentChar))
        {
            if (newWord)
            {
                newWord = false;
                currentChar = Char.ToUpper(currentChar);
            }
            else
            {
                currentChar = Char.ToLower(currentChar);
            }
        }
        else if (Char.IsWhiteSpace(currentChar))
        {
            newWord = true;
        }
        charArray[i] = currentChar;
    }
    return new string(charArray);
}
1
Jeson Martajaya
String TitleCaseString(String s)
{
    if (s == null || s.Length == 0) return s;

    string[] splits = s.Split(' ');

    for (int i = 0; i < splits.Length; i++)
    {
        switch (splits[i].Length)
        {
            case 1:
                break;

            default:
                splits[i] = Char.ToUpper(splits[i][0]) + splits[i].Substring(1);
                break;
        }
    }

    return String.Join(" ", splits);
}
1
varun sharma

En tant que méthode d'extension:

/// <summary>
//     Returns a copy of this string converted to `Title Case`.
/// </summary>
/// <param name="value">The string to convert.</param>
/// <returns>The `Title Case` equivalent of the current string.</returns>
public static string ToTitleCase(this string value)
{
    string result = string.Empty;

    for (int i = 0; i < value.Length; i++)
    {
        char p = i == 0 ? char.MinValue : value[i - 1];
        char c = value[i];

        result += char.IsLetter(c) && ((p is ' ') || p is char.MinValue) ? $"{char.ToUpper(c)}" : $"{char.ToLower(c)}";
    }

    return result;
}

Usage:

"kebab is DELICIOU's   ;d  c...".ToTitleCase();

Résultat:

Kebab Is Deliciou's ;d C...

0
Ahmed Tarek

Alternative en référence à Microsoft.VisualBasic (gère également les chaînes de caractères majuscules):

_string properCase = Strings.StrConv(str, VbStrConv.ProperCase);
_
0
Slai

Essaye ça:

using System.Globalization;
using System.Threading;
public void ToTitleCase(TextBox TextBoxName)
        {
            int TextLength = TextBoxName.Text.Length;
            if (TextLength == 1)
            {
                CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
                TextInfo textInfo = cultureInfo.TextInfo;
                TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
                TextBoxName.SelectionStart = 1;
            }
            else if (TextLength > 1 && TextBoxName.SelectionStart < TextLength)
            {
                int x = TextBoxName.SelectionStart;
                CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
                TextInfo textInfo = cultureInfo.TextInfo;
                TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
                TextBoxName.SelectionStart = x;
            }
            else if (TextLength > 1 && TextBoxName.SelectionStart >= TextLength)
            {
                CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
                TextInfo textInfo = cultureInfo.TextInfo;
                TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
                TextBoxName.SelectionStart = TextLength;
            }
        }


Appelez cette méthode dans l'événement TextChanged de la TextBox.

0
krishna

J'ai utilisé les références ci-dessus et la solution complète est: -

Use Namespace System.Globalization;
string str="INFOA2Z means all information";

// Besoin d'un résultat comme "Infoa2z signifie toutes les informations"
// Nous devons également convertir la chaîne en minuscule, sinon elle ne fonctionnera pas correctement. 

TextInfo ProperCase= new CultureInfo("en-US", false).TextInfo;

str= ProperCase.ToTitleCase(str.toLower());

http://www.infoa2z.com/asp.net/change-string-to-proper-case-in-an-asp.net-using-c#

0
Rakesh Dhiman

Vous pouvez modifier directement le texte ou la chaîne en utilisant cette méthode simple, après vérification des valeurs de chaîne nulles ou vides afin d'éliminer les erreurs:

public string textToProper(string text)
{
    string ProperText = string.Empty;
    if (!string.IsNullOrEmpty(text))
    {
        ProperText = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text);
    }
    else
    {
        ProperText = string.Empty;
    }
    return ProperText;
}
0
Ashraf Abusada

C’est ce que j’utilise et cela fonctionne dans la plupart des cas sauf si l’utilisateur décide de le remplacer en appuyant sur Maj ou sur le verrouillage majuscule. Comme sur les claviers Android et iOS.

Private Class ProperCaseHandler
    Private Const wordbreak As String = " ,.1234567890;/\-()#$%^&*€!~+=@"
    Private txtProperCase As TextBox

    Sub New(txt As TextBox)
        txtProperCase = txt
        AddHandler txt.KeyPress, AddressOf txtTextKeyDownProperCase
    End Sub

    Private Sub txtTextKeyDownProperCase(ByVal sender As System.Object, ByVal e As Windows.Forms.KeyPressEventArgs)
        Try
            If Control.IsKeyLocked(Keys.CapsLock) Or Control.ModifierKeys = Keys.Shift Then
                Exit Sub
            Else
                If txtProperCase.TextLength = 0 Then
                    e.KeyChar = e.KeyChar.ToString.ToUpper()
                    e.Handled = False
                Else
                    Dim lastChar As String = txtProperCase.Text.Substring(txtProperCase.SelectionStart - 1, 1)

                    If wordbreak.Contains(lastChar) = True Then
                        e.KeyChar = e.KeyChar.ToString.ToUpper()
                        e.Handled = False
                    End If
                End If

            End If

        Catch ex As Exception
            Exit Sub
        End Try
    End Sub
End Class
0
Dasith Wijes

Fonctionne bien même avec un étui à chameau: 'un texte en page " 

public static class StringExtensions
{
    /// <summary>
    /// Title case example: 'Some Text In Your Page'.
    /// </summary>
    /// <param name="text">Support camel and title cases combinations: 'someText in YourPage'</param>
    public static string ToTitleCase(this string text)
    {
        if (string.IsNullOrEmpty(text))
        {
            return text;
        }
        var result = string.Empty;
        var splitedBySpace = text.Split(new[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries);
        foreach (var sequence in splitedBySpace)
        {
            // let's check the letters. Sequence can contain even 2 words in camel case
            for (var i = 0; i < sequence.Length; i++)
            {
                var letter = sequence[i].ToString();
                // if the letter is Big or it was spaced so this is a start of another Word
                if (letter == letter.ToUpper() || i == 0)
                {
                    // add a space between words
                    result += ' ';
                }
                result += i == 0 ? letter.ToUpper() : letter;
            }
        }            
        return result.Trim();
    }
}
0
Igor

Pour ceux qui cherchent à le faire automatiquement sur keypress, je l'ai fait avec le code suivant en vb.net sur un contrôle de zone de texte personnalisé - vous pouvez évidemment aussi le faire avec une zone de texte normale - mais j'aime bien la possibilité d'ajouter du code récurrent pour des contrôles spécifiques via des contrôles personnalisés, il convient au concept de la programmation orientée objet.

Imports System.Windows.Forms
Imports System.Drawing
Imports System.ComponentModel

Public Class MyTextBox
    Inherits System.Windows.Forms.TextBox
    Private LastKeyIsNotAlpha As Boolean = True
    Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
        If _ProperCasing Then
            Dim c As Char = e.KeyChar
            If Char.IsLetter(c) Then
                If LastKeyIsNotAlpha Then
                    e.KeyChar = Char.ToUpper(c)
                    LastKeyIsNotAlpha = False
                End If
            Else
                LastKeyIsNotAlpha = True
            End If
        End If
        MyBase.OnKeyPress(e)
End Sub
    Private _ProperCasing As Boolean = False
    <Category("Behavior"), Description("When Enabled ensures for automatic proper casing of string"), Browsable(True)>
    Public Property ProperCasing As Boolean
        Get
            Return _ProperCasing
        End Get
        Set(value As Boolean)
            _ProperCasing = value
        End Set
    End Property
End Class
0
Andre Gotlieb