มีวิธีที่ง่ายที่จะใช้อักษรตัวแรกของสตริงและลดส่วนที่เหลือของมัน? มีวิธีการในตัวหรือฉันต้องทำเอง
มีวิธีที่ง่ายที่จะใช้อักษรตัวแรกของสตริงและลดส่วนที่เหลือของมัน? มีวิธีการในตัวหรือฉันต้องทำเอง
คำตอบ:
TextInfo.ToTitleCase()
ใช้อักษรตัวแรกในแต่ละโทเค็นของสตริง
หากมีความจำเป็นต้องรักษาตัวย่อ Uppercasing 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());
ดูลิงก์ MSDNสำหรับคำอธิบายโดยละเอียด
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
ว่าเราจะมั่นใจได้อย่างไรว่าไม่มีวัฒนธรรมใดที่จัดการสิ่งนี้แตกต่างกันอย่างไร
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
\b[ivxlcdm]+$|
\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
มันจะทำให้คำที่ลงท้ายด้วยชื่อมีรูปแบบตัวเลขโรมันที่ไม่เข้มงวด ( ivxlcdm
) คุณอาจมีผลลัพธ์ที่ไม่พึงประสงค์เช่น 'Li' จะกลายเป็น 'LI'
Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
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 () ควรใช้งานได้สำหรับคุณ
ตัวเลือกที่ตรงที่สุดคือการใช้ฟังก์ชันToTitleCaseที่มีอยู่ใน. NET ซึ่งควรดูแลชื่อส่วนใหญ่ตลอดเวลา ดังที่edgชี้ให้เห็นว่ามีชื่อบางชื่อที่ไม่สามารถใช้งานได้ แต่สิ่งเหล่านี้ค่อนข้างหายากดังนั้นหากคุณไม่ได้กำหนดเป้าหมายวัฒนธรรมที่ชื่อทั่วไปนั้นไม่จำเป็นต้องมีสิ่งที่คุณต้องกังวลมากเกินไป
อย่างไรก็ตามหากคุณไม่ได้ทำงานกับ. 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" คุณจะต้องแยกตามคอมมา อย่างไรก็ตามเมื่อคุณแยกมันออกแล้วคุณเพียงแค่ใช้รหัสที่แสดงก่อนหน้านี้
ฉันใช้วิธีการของตัวเองเพื่อแก้ไขปัญหานี้:
ตัวอย่างเช่นวลี: "hello world สวัสดีนี่คือโลก stackoverflow" จะเป็น "Hello World สวัสดีนี่คือ The Stackoverflow World" 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 บนตัวอักขระที่เหลือ
ชั้นเรียนนี้ใช้กลอุบาย คุณสามารถเพิ่มคำนำหน้าใหม่ให้กับ_prefixesคงที่อาร์เรย์สตริง
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 คุณสามารถใช้วิธีการขยายเพื่อเพิ่มเข้าไปในคลาส String ได้:
public static string FirstLetterToUpper(this String input)
{
return input = input.Substring(0, 1).ToUpper() +
input.Substring(1, input.Length - 1);
}
Char.ToUpper(input[0]) + input.Substring(1)
สามารถอ่านได้มากขึ้น IMHO
input.FirstLetterToUpper()
แน่นอนมากขึ้นอ่านเทียบกับChar.ToUpper(input[0]) + input.Substring(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;
}