ऊपरी शब्दों में पहले अक्षर को परिवर्तित करें, प्रत्येक शब्द के लिए कम करें


110

मेरे पास पाठ का एक स्ट्रिंग है (लगभग 5-6 शब्द) जो मुझे बदलने की आवश्यकता है।

वर्तमान में पाठ इस तरह दिखता है:

THIS IS MY TEXT RIGHT NOW

मैं इसे रूपांतरित करना चाहता हूं:

This Is My Text Right Now

मैं अपने स्ट्रिंग्स के संग्रह के माध्यम से लूप कर सकता हूं, लेकिन यह निश्चित नहीं है कि इस पाठ संशोधन को करने के बारे में कैसे जाना जाए।

जवाबों:


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

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

31
हा हा वास्तव में? वह कहां है? मैं .NET से प्यार करता हूं, लेकिन कुछ एपीआई डिजाइनर असली झटके हैं।
जॉर्ज मौअर

7
ध्यान दें कि यह विधि वही करेगी जो प्रश्नकर्ता ने पूछा है, यह एक भोली एल्गोरिथ्म है जो प्रत्येक शब्द को केवल कैपिटल करता है, बिना यह जाने कि यह किस प्रकार का शब्द है। यह वास्तव में "शीर्षक मामला" नहीं है क्योंकि शीर्षक आवरण के नियम विभिन्न भाषाओं में भिन्न हैं। यह अंग्रेजी के लिए भी सही नहीं है। उदाहरण के लिए, शीर्षक "एक लड़के के बारे में" अंग्रेजी में "अबाउट ए बॉय" होना चाहिए, लेकिन यह विधि "अबाउट ए बॉय" होगी। यदि आप सही शीर्षक मामला चाहते हैं , तो आपको अपनी विधि लिखनी होगी।
रयान ल्यूडी

18
मैं उन्हें झटके नहीं कहूंगा। "ToTitleCase" के साथ बात यह है कि यह संस्कृति पर निर्भर है, इसलिए इसे System.Globalization नाम में होना चाहिए। करंट थ्रेड के माध्यम से जा रहा है बस थ्रेड की वर्तमान संस्कृति को प्राप्त करने के लिए किया जाता है (ध्यान रखें कि यह भिन्न व्यवहार का कारण हो सकता है यदि उपयोगकर्ता का एक अलग लोकेल है!)। आप "CultureInfo.InvariantCulture.TextInfo.ToTitleCase ()" भी कर सकते हैं, जो बेहतर हो सकता है क्योंकि InvariantCulture सभी संस्कृतियों पर समान व्यवहार करता है। आउट ऑफ इंटरेस्ट जॉर्ज: आप एक संस्कृति-विशिष्ट स्ट्रिंग फ़ंक्शन कहाँ रखेंगे?
माइकल Stum

3
यह भी ध्यान रखें सभी अपरकेस तार के बारे में टिप्पणी: msdn.microsoft.com/en-us/library/...
माइकल Stum

2
विधि toLower () ToLower () होनी चाहिए, विधि का पहला अक्षर अपरकेस से शुरू होता है
एलेक्स

84

मैं शायद आह्वान करने के लिए पसंद करते हैं ToTitleCase से CultureInfo ( System.Globalization ) की तुलना में Thread.CurrentThread ( System.Threading )

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

लेकिन यह jspcal समाधान के समान होना चाहिए

संपादित करें

वास्तव में वे समाधान समान नहीं हैं : CurrentThread- कॉल -> 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);
    }

दूसरा तरीका (जो थोड़ा तेज़ है) स्ट्रिंग को एक चार सरणी में विभाजित करना है और फिर स्ट्रिंग को फिर से बनाना है:

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

1
यह समाधान प्रश्न का पर्याप्त रूप से उत्तर नहीं देता है। प्रश्न का शीर्षक "ऊपरी अक्षर के सभी पहले अक्षर को बदलें, प्रत्येक शब्द के लिए बाकी कम है"। हालांकि, यह समाधान केवल पूरे स्ट्रिंग के पहले अक्षर को कैपिटल करता है। इसलिए, यह समाधान "हैलो वर्ल्ड" के बजाय "हैलो वर्ल्ड" को "हैलो वर्ल्ड" में बदल देगा।
brsfan

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

अनिवार्य रूप से यह कहता है कि "अल्फ़ान्यूमेरिक वर्ण की सभी घटनाओं पर एक रेगेक्स मैच को प्रीफ़ॉर्म करें जो एक अन्य अल्फ़ान्यूमेरिक वर्ण का अनुसरण करता है और फिर इसे स्वयं के लोअरकेस संस्करण से प्रतिस्थापित करता है"


यह भी सभी अपरकेस शब्दों को अपरकेस से शुरू करता है और लोअरकेस के साथ जारी रखता है। ठीक वही जो मेरे द्वारा खोजा जा रहा था।
एम। अज़ोकसूल

9

यदि आप वेब पेज पर उपयोग कर रहे हैं, तो आप CSS का भी उपयोग कर सकते हैं:

style="text-transform:capitalize;"


2
सीएसएस क्यों? जब सवाल c # asp.net regex
Jay

1
टैग ASP.NETदिखाता है कि ओपी यह वेब पर कर रहा है। बेशक यह सवाल का जवाब नहीं है क्योंकि ओपी को समाधान की आवश्यकता है C#लेकिन यह समस्या को हल करता है और एक वैकल्पिक समाधान हो सकता है। +1
मुहम्मद साकिब

6

जब बड़ी टेबल गति का निर्माण एक चिंता का विषय है तो जेमी डिक्सन का दूसरा कार्य सबसे अच्छा है, लेकिन यह पूरी तरह से काम नहीं करता है ...

यह सभी अक्षरों को कम करने में विफल रहता है, और यह केवल स्ट्रिंग के पहले अक्षर को कैपिटल करता है, स्ट्रिंग के प्रत्येक शब्द का पहला अक्षर नहीं ... नीचे का विकल्प दोनों मुद्दों को ठीक करता है:

    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जॉर्ज मौयर द्वारा प्रदान किया गया समाधान तेज हो सकता है ... किसी को जो पर्याप्त देखभाल करता है, उसे परीक्षण करना चाहिए।


2
यह काम करता है, लेकिन मैंने इसे "a.Count ()" को बदल दिया है। लैंथ
ईसाई

2

मुझे नहीं पता कि नीचे दिए गए समाधान jspcal के उत्तर की तुलना में अधिक या कम कुशल हैं, लेकिन मुझे पूरा यकीन है कि इसे जैमी और जॉर्ज की तुलना में कम ऑब्जेक्ट निर्माण की आवश्यकता है।

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
यदि हम वस्तु निर्माण से चिंतित हैं, तो स्ट्रिंग स्ट्रिंग के उपयोग के बजाय लूप इंडेक्सिंग के साथ इन-प्लेस क्यों नहीं करते?
२०

0

पहले उत्तर के अलावा, शब्द के अंत में स्ट्रिंग चयन सूची इंडेक्स बदलने के लिए याद रखें या आपको स्ट्रिंग में अक्षरों का रिवर्स ऑर्डर मिलेगा।

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