शीर्षक मामले में स्ट्रिंग परिवर्तित


300

मेरे पास एक स्ट्रिंग है जिसमें ऊपरी और निचले मामले के पात्रों के मिश्रण में शब्द हैं।

उदाहरण के लिए: string myData = "a Simple string";

मुझे प्रत्येक शब्द के पहले चरित्र (रिक्त स्थान से अलग) को ऊपरी मामले में बदलने की आवश्यकता है। इसलिए मैं परिणाम चाहता हूं:string myData ="A Simple String";

क्या ऐसा करने का कोई आसान तरीका है? मैं स्ट्रिंग को विभाजित नहीं करना चाहता हूं और रूपांतरण करना चाहता हूं (यह मेरा अंतिम उपाय होगा)। इसके अलावा, यह गारंटी है कि तार अंग्रेजी में हैं।


1
http://support.microsoft.com/kb/312890 - विज़ुअल सी # का उपयोग करके स्ट्रिंग्स को लोअर, अपर, या टाइटल (उचित) केस में कैसे
बदलें

जवाबों:


538

MSDN: TextInfo.ToTitleCase

सुनिश्चित करें कि आप शामिल हैं: 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

37
सच। इसके अलावा, यदि कोई शब्द सभी ऊपरी मामले में काम नहीं करता है। जैसे - "एक FBI एजेंट ने मेरी DOG को गोली मार दी" -> "एक FBI एजेंट ने मेरी DOG को गोली मार दी"। और यह "मैकडॉनल्ड्स", और इसके बाद संभाल नहीं करता है।
कोबी

5
@Kirschstein यह फ़ंक्शन इन शब्दों को शीर्षक मामले में परिवर्तित करता है , भले ही वे अंग्रेजी में न हों। दस्तावेज़ देखें: Actual result: "War And Peace"
कोबी जूल

5
@ सिंबोलो - मैंने एक्टुलेट का उल्लेख एक टिप्पणी में किया था ... आप कुछ का उपयोग कर सकते हैं text = Regex.Replace(text, @"(?<!\S)\p{Ll}", m => m.Value.ToUpper());, लेकिन यह बिल्कुल सही है। उदाहरण के लिए, यह अभी भी उद्धरण या कोष्ठक - "(one two three)"-> को संभालता नहीं है "(one Two Three)"। आप इन मामलों के साथ क्या करना चाहते हैं, यह जानने के बाद आप एक नया प्रश्न पूछना चाहते हैं।
कोबी

17
किसी कारण के लिए जब मेरे पास "DR" है तो यह "Dr" नहीं बन जाता है जब तक कि मैं कॉल नहीं करता। ToLitower () पहली बार ToTitleCase () कॉल करने से पहले ... तो यह देखने के लिए कुछ है ...
Tod Thomson

16
यदि इनपुट टेक्स्ट ऊपरी मामले में है तो .ToLower () इनपुट स्ट्रिंग की आवश्यकता है
पुनीत घनशानी

137

इसे इस्तेमाल करे:

string myText = "a Simple string";

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

जैसा कि पहले ही बताया जा चुका है, TextInfo.ToTitleCase का उपयोग करके आप अपने इच्छित परिणाम नहीं दे सकते हैं। यदि आपको आउटपुट पर अधिक नियंत्रण की आवश्यकता है, तो आप ऐसा कुछ कर सकते हैं:

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

और फिर इसे इस तरह उपयोग करें:

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

1
मैंने TextInfo ऑब्जेक्ट की कई विविधताओं की कोशिश की - कोई त्रुटि नहीं लेकिन मूल स्ट्रिंग (ऊपरी मामले) को कभी भी अपडेट नहीं किया गया था। इस पद्धति को प्लग इन किया है और बहुत सराहनीय हूं।
JustSteve

6
@justSteve, MSDN ( msdn.microsoft.com/en-us/library/… ) से: "हालांकि, यह विधि वर्तमान में किसी शब्द को पूरी तरह से अपरकेस के रूप में परिवर्तित करने के लिए उचित आवरण प्रदान नहीं करती है, जैसे कि एक संक्षिप्त विवरण" - आपको शायद चाहिए बस ToLower () यह पहले (मुझे पता है कि यह पुराना है, लेकिन सिर्फ मामले में कोई और इस पर ठोकर
खाता है

केवल .NET फ्रेमवर्क 4.7.2 <= आपके फ़्रेम वर्क के लिए उपलब्ध <= .NET कोर 2.0
पॉल गोरबस

70

फिर भी एक और बदलाव। यहाँ कई युक्तियों के आधार पर मैंने इसे इस विस्तार विधि में कम कर दिया है, जो मेरे उद्देश्यों के लिए बहुत अच्छा काम करती है:

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

8
CultureInfo.InvariantCulture.TextInfo.ToTitleCase (s.ToLower ()); वास्तव में एक बेहतर फिट होगा!
पुनीत घनशानी

केवल .NET फ्रेमवर्क 4.7.2 <= आपके फ़्रेम वर्क के लिए उपलब्ध <= .NET कोर 2.0
पॉल गोर्बस

चूंकि हम TitleCasing के लिए InvariantCulture का उपयोग कर रहे हैं, s.ToLowerInvariant () का उपयोग s.ToLower () के बजाय किया जाना चाहिए।
विनगास

27

व्यक्तिगत रूप से मैंने TextInfo.ToTitleCaseविधि की कोशिश की , लेकिन, मुझे समझ में नहीं आता कि जब सभी वर्ण ऊपरी आवरण वाले होते हैं तो यह काम क्यों नहीं करता है।

हालांकि मुझे विंस्टन स्मिथ द्वारा प्रदान किया गया उपयोग फ़ंक्शन पसंद है , मुझे वह फ़ंक्शन प्रदान करने दें जो मैं वर्तमान में उपयोग कर रहा हूं:

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

कुछ के साथ खेलना परीक्षण तार:

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

देते हुए आउटपुट :

|Converting String To Title Case In C#|
|C|
||
|   |
||

1
@harsh: "बदसूरत" समाधान मैं कहूंगा ... मेरे लिए कोई मतलब नहीं है कि आपके पास पहले स्ट्रिंग को निचले-मामले में बदलने के लिए है।
लुइस क्विजादा

4
यह जानबूझकर है, क्योंकि यदि आप "यूनिसेफ और चैरिटी" के लिए कहते हैं, तो शीर्षक-आवरण के रूप में, आप नहीं चाहते कि इसे यूनिसेफ में बदल दिया जाए।
केसी

4
इसलिए ToLower()पूरे स्ट्रिंग पर कॉल करने के बजाय , आप वह सब काम स्वयं करेंगे और प्रत्येक व्यक्ति के चरित्र पर एक ही कार्य करेंगे? न केवल यह एक बदसूरत समाधान है, यह शून्य लाभ दे रहा है, और यहां तक ​​कि अंतर्निहित फ़ंक्शन की तुलना में अधिक समय लगेगा।
क्रिलगर

3
rest = words[i].Substring(1).ToLower();
क्रिलगर

1
@ruffin सं सबस्ट्रिंग स्ट्रिंग के अंत करने के लिए दिए गए इंडेक्स पर एक भी पूर्णांक पैरामीटर शुरू होता है के साथ, और रिटर्न सब कुछ।
क्रिलगर

21

हाल ही में मुझे एक बेहतर समाधान मिला।

यदि आपके पाठ में अपरकेस में प्रत्येक अक्षर है, तो TextInfo इसे उचित मामले में परिवर्तित नहीं करेगा। हम इस तरह से लोअरकेस फ़ंक्शन का उपयोग करके इसे ठीक कर सकते हैं:

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

अब यह उन सभी चीजों को रूपांतरित कर देगा जो प्रॉपरकेस में आती हैं।


17
public static string PropCase(string strText)
{
    return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}

1
मुझे पसंद है कि आपने ToTitleCase से पहले ToLower जोड़ा था, उस स्थिति को कवर करता है जहां इनपुट पाठ सभी कैप्स हैं।
joelc

7

यदि कोई व्यक्ति कॉम्पैक्ट फ्रेमवर्क के समाधान के लिए इच्छुक है:

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

स्ट्रिंग इंटरपोलेशन के साथ: रिटर्न स्ट्रिंग। जॉइन ("", text.Split ('') .Select (i => $ "{i.Substring (0, 1) .TUUpper ()) {i.S.Sstring (1)। ToLower ()} ") .ToArray ());
टेड

6

यहां जानिए उस समस्या का हल ...

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

5

सही आउटपुट प्राप्त करने के लिए परिणाम की ToLower()तुलना में पहले का उपयोग करें CultureInfo.CurrentCulture.TextInfo.ToTitleCase

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

3

मुझे सभी कैप्स शब्दों से निपटने के लिए एक तरीके की आवश्यकता थी, और मुझे रिकी एएच का समाधान पसंद आया, लेकिन मैंने इसे एक विस्तार विधि के रूप में लागू करने के लिए एक कदम आगे बढ़ाया। यह आपके वर्ण वर्ण बनाने के चरण को टाल देता है और फिर उस पर ToArray को हर बार स्पष्ट रूप से कॉल करें - इसलिए आप इसे स्ट्रिंग पर कॉल कर सकते हैं, जैसे:

उपयोग:

string newString = oldString.ToProper();

कोड:

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

}

1
बस एक और OR शर्त जोड़ी गयी (c == '' || c == '\' ') ... कभी-कभी नामों में apostrophes (') होता है।
जेएसके

2

अपने कोड की कोशिश करके समझने में बेहतर है ...

अधिक पढ़ें

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

1) एक स्ट्रिंग को अपरकेस में बदलें

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

2) एक स्ट्रिंग को लोअरकेस में बदलें

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

3) एक स्ट्रिंग को टाइटलकेस में बदलें

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

1

यहाँ एक कार्यान्वयन, चरित्र द्वारा चरित्र है। "(एक दो तीन)" के साथ काम करना चाहिए

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

त्रुटियों को समाप्त करने के लिए, नल या खाली स्ट्रिंग मानों की जाँच करने के बाद, आप इस सरल विधि का उपयोग करके सीधे पाठ या स्ट्रिंग को बदल सकते हैं:

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

इसे इस्तेमाल करे:

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


इस विधि को टेक्स्टबॉक्स की TextChanged घटना में कहें।


0

मैंने उपरोक्त संदर्भों का उपयोग किया है और पूर्ण समाधान है: -

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

// आवश्यकता परिणाम जैसे "Infoa2z मीन्स ऑल इनफॉर्मेशन"
// हमें स्ट्रिंग को लोअरकेस में भी बदलने की आवश्यकता है, अन्यथा यह ठीक से काम नहीं कर रहा है।

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

यह वही है जो मैं उपयोग करता हूं और यह ज्यादातर मामलों के लिए काम करता है जब तक कि उपयोगकर्ता इसे शिफ्ट या कैप्स लॉक दबाकर इसे ओवरराइड करने का निर्णय नहीं लेता है। जैसे Android और 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

उन लोगों के लिए जो इसे कीपर पर स्वचालित रूप से करना चाहते हैं, मैंने इसे एक कस्टम टेक्स्टबॉक्स कॉन्ट्रोल पर vb.net में निम्नलिखित कोड के साथ किया था - आप स्पष्ट रूप से एक सामान्य टेक्स्टबॉक्स के साथ भी कर सकते हैं - लेकिन मुझे विशिष्ट नियंत्रणों के लिए आवर्ती कोड जोड़ना पसंद है कस्टम नियंत्रण के माध्यम से यह OOP की अवधारणा के अनुरूप है।

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

ऊंट मामले में भी ठीक काम करता है: 'someText in YourPage'

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

एक विस्तार विधि के रूप में:

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

उपयोग:

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

परिणाम:

Kebab Is Deliciou's ;d C...


0

संदर्भ के साथ वैकल्पिक Microsoft.VisualBasic(अपरकेस स्ट्रिंग्स भी संभालता है):

string properCase = Strings.StrConv(str, VbStrConv.ProperCase);

0

उपयोग किए बिना TextInfo:

public static string TitleCase(this string text, char seperator = ' ') =>
  string.Join(seperator, text.Split(seperator).Select(word => new string(
    word.Select((letter, i) => i == 0 ? char.ToUpper(letter) : char.ToLower(letter)).ToArray())));

यह प्रत्येक शब्द में प्रत्येक अक्षर के माध्यम से लूप करता है, इसे अपरकेस में परिवर्तित करता है यदि यह पहला अक्षर है अन्यथा इसे लोअरकेस में परिवर्तित करें।


-1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं सी के लिए एक ही चीज की खोज कर रहा था और मुझे यह पता चला कि मुझे लगा कि अगर कोई और व्यक्ति सी में रास्ता खोज रहा है तो मैं इसे पोस्ट करूंगा।

char proper(char string[]){  

int i = 0;

for(i=0; i<=25; i++)
{
    string[i] = tolower(string[i]);  //converts all character to lower case
    if(string[i-1] == ' ') //if character before is a space 
    {
        string[i] = toupper(string[i]); //converts characters after spaces to upper case
    }

}
    string[0] = toupper(string[0]); //converts first character to upper case


    return 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.