Có một cách dễ dàng để viết hoa chữ cái đầu tiên của chuỗi và hạ thấp phần còn lại của chuỗi không? Có một phương pháp được xây dựng trong hoặc tôi cần phải làm cho riêng mình?
Có một cách dễ dàng để viết hoa chữ cái đầu tiên của chuỗi và hạ thấp phần còn lại của chuỗi không? Có một phương pháp được xây dựng trong hoặc tôi cần phải làm cho riêng mình?
Câu trả lời:
TextInfo.ToTitleCase()
viết hoa ký tự đầu tiên trong mỗi mã thông báo của chuỗi.
Nếu không có nhu cầu duy trì viết tắt Acronym, thì bạn nên bao gồm ToLower()
.
string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"
Nếu CurrentCARM không khả dụng, hãy sử dụng:
string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());
Xem Liên kết MSDN để biết mô tả chi tiết.
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, làm thế nào chúng ta có thể chắc chắn rằng không có văn hóa nào xử lý việc này khác nhau?
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);
Các mã trên sẽ không hoạt động .....
Vì vậy, đặt mã dưới đây bằng cách chuyển đổi để thấp hơn sau đó áp dụng chức năng
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
Có một số trường hợp CultureInfo.CurrentCulture.TextInfo.ToTitleCase
không thể xử lý, ví dụ: dấu nháy đơn '
.
string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo
Một regex cũng có thể được sử dụng \b[a-zA-Z]
để xác định ký tự bắt đầu của một từ sau một ranh giới từ \b
, sau đó chúng ta chỉ cần thay thế từ khớp bằng chữ hoa của nó nhờ Regex.Replace(string input,string pattern,MatchEvaluator evaluator)
phương thức:
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
Các regex có thể được điều chỉnh nếu cần thiết, ví dụ, nếu chúng ta muốn xử lý MacDonald
và McFry
các trường hợp regex trở thành:(?<=\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
Nếu chúng ta cần xử lý nhiều tiền tố hơn, chúng ta chỉ cần sửa đổi nhóm (?:mc|mac)
, ví dụ để thêm tiền tố tiếng Pháp du, de
:(?:mc|mac|du|de)
.
Cuối cùng, chúng ta có thể nhận ra rằng regex này cũng sẽ khớp với trường hợp MacDonald'S
cuối cùng 's
vì vậy chúng ta cần xử lý nó trong regex với một cái nhìn tiêu cực phía sau (?<!'s\b)
. Cuối cùng, chúng ta có:
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]+$|
vì vậy bạn có \b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Nó sẽ tạo ra tất cả các từ kết thúc của một tên có định dạng chữ số La Mã không nghiêm ngặt ( ivxlcdm
). Tuy nhiên, bạn có thể có một số kết quả không mong muốn, ví dụ 'Li' sẽ trở thành 'LI'
Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
Mc và Mac là tiền tố họ phổ biến trên khắp Hoa Kỳ, và có những tiền tố khác. TextInfo.ToTitleCase không xử lý các trường hợp đó và không nên được sử dụng cho mục đích này. Đây là cách tôi đang làm:
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 () sẽ hoạt động cho bạn.
Tùy chọn trực tiếp nhất sẽ là sử dụng chức năng ToTitleCase có sẵn trong .NET, phần lớn sẽ đảm nhiệm tên này hầu hết thời gian. Như edg đã chỉ ra rằng có một số tên mà nó sẽ không hoạt động, nhưng chúng khá hiếm vì vậy trừ khi bạn nhắm mục tiêu vào một nền văn hóa nơi những cái tên đó là phổ biến, bạn không phải lo lắng quá nhiều.
Tuy nhiên, nếu bạn không làm việc với ngôn ngữ .NET, thì nó phụ thuộc vào đầu vào trông như thế nào - nếu bạn có hai trường riêng biệt cho tên và họ thì bạn có thể viết hoa chữ cái đầu tiên thấp hơn phần còn lại của nó bằng cách sử dụng chất nền.
firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();
Tuy nhiên, nếu bạn được cung cấp nhiều tên như một phần của cùng một chuỗi thì bạn cần biết làm thế nào bạn có được thông tin và phân chia nó cho phù hợp. Vì vậy, nếu bạn nhận được một cái tên như "John Doe", bạn hãy tách chuỗi dựa trên ký tự khoảng trắng. Nếu nó ở định dạng như "Doe, John", bạn sẽ cần phải phân tách nó dựa trên dấu phẩy. Tuy nhiên, một khi bạn đã tách nó ra, bạn chỉ cần áp dụng mã được hiển thị trước đó.
Tôi sử dụng phương pháp của riêng tôi để sửa lỗi này:
Ví dụ: cụm từ: "xin chào thế giới. Xin chào, đây là thế giới stackoverflow." sẽ là "Xin chào thế giới. Xin chào đây là thế giới Stackoverflow." Regex \ b (bắt đầu một từ) \ w (ký tự đầu tiên của từ) sẽ thực hiện thủ thuật.
/// <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;
}
Lớp học này thực hiện các mẹo. Bạn có thể thêm tiền tố mới vào mảng chuỗi tĩnh _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();
}
}
Nếu bạn sử dụng vS2k8, bạn có thể sử dụng một phương thức mở rộng để thêm nó vào lớp 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 dễ đọc hơn.
input.FirstLetterToUpper()
chắc chắn dễ đọc hơn so với Char.ToUpper(input[0]) + input.Substring(1)
, nhưng ít minh bạch
Để giải quyết một số vấn đề / vấn đề đã được làm nổi bật, tôi khuyên bạn nên chuyển đổi chuỗi thành chữ thường trước và sau đó gọi phương thức ToTitleCase. Sau đó, bạn có thể sử dụng IndexOf ("Mc") hoặc IndexOf ("O \ '") để xác định các trường hợp đặc biệt cần chú ý cụ thể hơn.
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);
}
Tôi thích cách này:
using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());
Nâng từ bài viết MSDN này .
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;
}
Giống như edg đã chỉ ra, bạn sẽ cần một thuật toán phức tạp hơn để xử lý các tên đặc biệt (đây có thể là lý do tại sao nhiều nơi buộc mọi thứ phải viết hoa).
Một cái gì đó như c # chưa được kiểm tra này sẽ xử lý trường hợp đơn giản mà bạn yêu cầu:
public string SentenceCase(string input)
{
return input(0, 1).ToUpper + input.Substring(1).ToLower;
}