كيف يمكنني تكبير الحرف الأول من الاسم الأول واسم العائلة في C#؟

StackOverflow https://stackoverflow.com/questions/72831

  •  09-06-2019
  •  | 
  •  

سؤال

هل هناك طريقة سهلة لتكبير الحرف الأول من السلسلة وخفض الباقي؟هل هناك طريقة مدمجة أم أحتاج إلى صنع طريقة خاصة بي؟

هل كانت مفيدة؟

المحلول

TextInfo.ToTitleCase() تكبير الحرف الأول في كل رمز مميز لسلسلة.
إذا لم تكن هناك حاجة للحفاظ على الأحرف الكبيرة للأحرف المختصرة، فيجب عليك تضمينها ToLower().

string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"

إذا لم يكن CurrentCulture متاحًا، فاستخدم:

string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());

انظر رابط ام اس دي ان للحصول على وصف تفصيلي.

نصائح أخرى

CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);

الكود أعلاه لن يعمل .....

لذا ضع الكود أدناه عن طريق التحويل إلى الأسفل ثم قم بتطبيق الوظيفة

String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());

هناك بعض الحالات التي CultureInfo.CurrentCulture.TextInfo.ToTitleCase لا يمكن التعامل معه، على سبيل المثال:الفاصلة العليا '.

string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo

أ regex يمكن أن تستخدم أيضا \b[a-zA-Z] لتحديد الحرف الأول للكلمة بعد حد الكلمة \b, ، فنحن نحتاج فقط إلى استبدال المباراة بمعادلتها ذات الأحرف الكبيرة بفضل Regex.Replace(string input,string pattern,MatchEvaluator evaluator) طريقة :

string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo

ال regex يمكن ضبطها إذا لزم الأمر، على سبيل المثال، إذا أردنا التعامل مع MacDonald و McFry الحالات يصبح regex: (?<=\b(?:mc|mac)?)[a-zA-Z]

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry

إذا أردنا التعامل مع المزيد من البادئات، فنحن نحتاج فقط إلى تعديل المجموعة (?:mc|mac), ، على سبيل المثال لإضافة البادئات الفرنسية du, de : (?:mc|mac|du|de).

وأخيرا، يمكننا أن ندرك أن هذا regex سوف تتطابق أيضا مع هذه القضية MacDonald'S لآخر 's لذلك نحن بحاجة للتعامل معها في regex مع نظرة سلبية وراء (?<!'s\b).في النهاية لدينا:

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry

تعد Mc وMac بادئات اللقب الشائعة في جميع أنحاء الولايات المتحدة، وهناك بادئات أخرى.لا يتعامل TextInfo.ToTitleCase مع هذه الحالات ولا ينبغي استخدامه لهذا الغرض.وإليك كيف أفعل ذلك:

    public static string ToTitleCase(string str)
    {
        string result = str;
        if (!string.IsNullOrEmpty(str))
        {
            var words = str.Split(' ');
            for (int index = 0; index < words.Length; index++)
            {
                var s = words[index];
                if (s.Length > 0)
                {
                    words[index] = s[0].ToString().ToUpper() + s.Substring(1);
                }
            }
            result = string.Join(" ", words);
        }
        return result;
    }

يجب أن يعمل ToTitleCase() من أجلك.

http://support.microsoft.com/kb/312890

سيكون الخيار الأكثر مباشرة هو استخدام ToTitleCase الوظيفة المتوفرة في .NET والتي يجب أن تعتني بالاسم في معظم الأوقات.مثل حافة أشار إلى أن هناك بعض الأسماء التي لن تعمل معها، ولكنها نادرة إلى حد ما، لذا ما لم تكن تستهدف ثقافة تكون فيها هذه الأسماء شائعة، فليس من الضروري أن تقلق كثيرًا بشأنها.

ومع ذلك، إذا كنت لا تعمل باستخدام لغة .NET، فإن ذلك يعتمد على الشكل الذي يبدو عليه الإدخال - إذا كان لديك حقلين منفصلين للاسم الأول واسم العائلة، فيمكنك فقط تكبير الحرف الأول وخفض الباقي باستخدام سلاسل فرعية.

firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();

ومع ذلك، إذا تم تزويدك بأسماء متعددة كجزء من نفس السلسلة، فأنت بحاجة إلى معرفة كيفية حصولك على المعلومات و تقسيمها وفقاً لذلك.لذا، إذا كنت تحصل على اسم مثل "John Doe"، فستقوم بتقسيم السلسلة بناءً على حرف المسافة.إذا كان بتنسيق مثل "Doe, John" فستحتاج إلى تقسيمه بناءً على الفاصلة.ومع ذلك، بمجرد تقسيمها، ما عليك سوى تطبيق الكود الموضح مسبقًا.

CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("اسمي")؛

يعود ~ اسمي

لكن المشكلة لا تزال موجودة مع أسماء مثل McFly كما ذكرنا سابقًا.

أستخدم طريقتي الخاصة لإصلاح هذا:

على سبيل المثال العبارة:"مرحبا بالعالم.مرحبًا، هذا هو عالم التدفق المكدس." سيكون "مرحبًا أيها العالم.مرحبًا، هذا هو عالم Stackoverflow."Regex \b (بداية الكلمة) \w (الحرف الأول للكلمة) سوف يقوم بالمهمة.

/// <summary>
/// Makes each first letter of a word uppercase. The rest will be lowercase
/// </summary>
/// <param name="Phrase"></param>
/// <returns></returns>
public static string FormatWordsWithFirstCapital(string Phrase)
{
     MatchCollection Matches = Regex.Matches(Phrase, "\\b\\w");
     Phrase = Phrase.ToLower();
     foreach (Match Match in Matches)
         Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper());

     return Phrase;
}

لن تعمل اقتراحات استخدام ToTitleCase مع السلاسل التي تكون كلها بأحرف كبيرة.لذلك سيتعين عليك الاتصال بـ ToUpper على الحرف الأول وToLower على الأحرف المتبقية.

هذه الفئة تفعل الحيلة.يمكنك إضافة بادئات جديدة إلى _البادئات مجموعة سلسلة ثابتة.

public static class StringExtensions
{
        public static string ToProperCase( this string original )
        {
            if( String.IsNullOrEmpty( original ) )
                return original;

            string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
            return result;
        }

        public static string WordToProperCase( this string word )
        {
            if( String.IsNullOrEmpty( word ) )
                return word;

            if( word.Length > 1 )
                return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );

            return word.ToUpper( CultureInfo.CurrentCulture );
        }

        private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
        private static readonly string[] _prefixes = {
                                                         "mc"
                                                     };

        private static string HandleWord( Match m )
        {
            string word = m.Groups[1].Value;

            foreach( string prefix in _prefixes )
            {
                if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
                    return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
            }

            return word.WordToProperCase();
        }
}

إذا كنت تستخدم الإصدار vS2k8، فيمكنك استخدام طريقة ملحقة لإضافته إلى فئة السلسلة:

public static string FirstLetterToUpper(this String input)
{
    return input = input.Substring(0, 1).ToUpper() + 
       input.Substring(1, input.Length - 1);
}

للتغلب على بعض المشكلات/المشكلات التي تم تسليط الضوء عليها، أقترح تحويل السلسلة إلى أحرف صغيرة أولاً ثم استدعاء الأسلوب ToTitleCase.يمكنك بعد ذلك استخدام IndexOf("Mc") أو IndexOf("O\'") لتحديد الحالات الخاصة التي تحتاج إلى مزيد من الاهتمام المحدد.

inputString = inputString.ToLower();
inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
int indexOfMc = inputString.IndexOf(" Mc");
if(indexOfMc  > 0)
{
   inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4);
}

أنا أحب هذه الطريقة:

using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());

مرفوع من هذا مقالة MSDN.

آمل أن يساعدك هذا.

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
 public static string ConvertToCaptilize(string input)
        {
            if (!string.IsNullOrEmpty(input))
            {
                string[] arrUserInput = input.Split(' ');


                // Initialize a string builder object for the output
                StringBuilder sbOutPut = new StringBuilder();


                // Loop thru each character in the string array
                foreach (string str in arrUserInput)
                {
                    if (!string.IsNullOrEmpty(str))
                    {
                        var charArray = str.ToCharArray();
                        int k = 0;
                        foreach (var cr in charArray)
                        {
                            char c;
                            c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr);
                            sbOutPut.Append(c);
                            k++;
                        }


                    }
                    sbOutPut.Append(" ");
                }
                return sbOutPut.ToString();
            }
            return string.Empty;

        }

كما هو موضح في edg، ستحتاج إلى خوارزمية أكثر تعقيدًا للتعامل مع الأسماء الخاصة (ربما يكون هذا هو السبب وراء فرض العديد من الأماكن كل شيء على الأحرف الكبيرة).

شيء مثل هذا c# الذي لم يتم اختباره يجب أن يتعامل مع الحالة البسيطة التي طلبتها:

public string SentenceCase(string input)
{
    return input(0, 1).ToUpper + input.Substring(1).ToLower;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top