2010-08-13 219 views
21

Làm cách nào để chữ cái đầu tiên trong văn bản được đặt thành vốn?Cách viết hoa chữ cái đầu tiên trong C#

Ví dụ:

it is a text. = It is a text. 
+2

Chuỗi có thể giống như "bánh quế 99c" hay không và bạn muốn t '" Bánh quế 99c "? Đó là, định nghĩa của bạn về "chữ cái đầu tiên" là gì? – polygenelubricants

+0

có thể trùng lặp của [Tạo chữ cái đầu tiên của một chữ hoa chữ thường] (http://stackoverflow.com/questions/4135317/make-first-letter-of-a-string-upper-case) – Jeroen

Trả lời

39
public static string ToUpperFirstLetter(this string source) 
{ 
    if (string.IsNullOrEmpty(source)) 
     return string.Empty; 
    // convert to char array of the string 
    char[] letters = source.ToCharArray(); 
    // upper case the first char 
    letters[0] = char.ToUpper(letters[0]); 
    // return the array made of the new char array 
    return new string(letters); 
} 
+2

Bạn không cần phải làm 'source.ToCharArray()'. Một chuỗi đã là một mảng char và có thể được lập chỉ mục chỉ với 'nguồn [0]'. –

+5

@Alastair, chuỗi là không thay đổi nhưng mảng char thì không. – Jacob

+1

@Jacob, Oooh yeah. Cho thấy làm thế nào chết não của tôi là vào một buổi chiều thứ Sáu:/ –

35

Nó sẽ có một cái gì đó như thế này:

// precondition: before must not be an empty string 

String after = before.Substring(0, 1).ToUpper() + before.Substring(1); 
+0

Tại sao nhiều người như chuỗi con? Nó có hiệu suất kém. –

+0

@Danny: hãy thảo luận nhận xét của bạn tại đây http://stackoverflow.com/questions/3474578/what-is-the-performance-of-substring-in-net – polygenelubricants

+2

.NET cũng chậm. C++ hoặc assembler nhanh hơn nhiều. Điều đó có nghĩa là chúng ta cần phải loại bỏ .NET và chuyển sang các ngôn ngữ nhanh hơn? –

3

Nếu bạn đang sử dụng C# sau đó thử mã này:

Microsoft.VisualBasic.StrConv(sourceString, Microsoft.VisualBasic.vbProperCase) 
+1

Điều này thật xấu. Nếu bạn sử dụng C#, tại sao bạn sẽ được nhập/tham chiếu DLL Visual Basic? –

+0

Đọc thẻ C#. NOT Means VB –

+6

@steven: Bạn có thể sử dụng thư viện VB từ C#. –

0
text = new String(
    new [] { char.ToUpper(text.First()) } 
    .Concat(text.Skip(1)) 
    .ToArray() 
); 
+1

Điều này cảm thấy giống như việc sử dụng LINQ một cách vô cớ đối với tôi ... –

+0

@Jon Skeet - Đó hoàn toàn là ý định của tôi :) Tôi đã thực sự tự hỏi hiệu suất sẽ được so sánh với phương pháp chuỗi con ở trên. – arootbeer

18

Câu trả lời của polygenelubricants là tốt cho hầu hết các trường hợp, nhưng bạn có thể cần phải suy nghĩ về các vấn đề văn hóa. Bạn có muốn điều này được viết hoa theo cách văn hóa bất biến, trong văn hóa hiện tại hay văn hóa cụ thể không? Ví dụ, nó có thể tạo nên sự khác biệt lớn ở Thổ Nhĩ Kỳ. Vì vậy, bạn có thể muốn xem xét:

CultureInfo culture = ...; 
text = char.ToUpper(text[0], culture) + text.Substring(1); 

hoặc nếu bạn thích phương pháp trên String:

CultureInfo culture = ...; 
text = text.Substring(0, 1).ToUpper(culture) + text.Substring(1); 

nơi culture có thể CultureInfo.InvariantCulture, hoặc nền văn hóa hiện tại vv

Để biết thêm về vấn đề này , xem Turkey Test.

+0

Hãy xem xét về CultrueInfos khác nhau, cũng như TextInfos. –

+0

cho tôi biết trường hợp nhất khi chúng ta cần nhập dll Microsoft.VisualBasic khi chúng tôi làm việc trên C# .net –

+0

Cân nhắc "CultureInfo" đã đưa ra giải pháp hoàn hảo ... Cảm ơn rất nhiều về Turkey Test :) –

1

Tôi nhận thấy đây là một bài đăng cũ, nhưng gần đây tôi đã gặp sự cố này và giải quyết vấn đề bằng phương pháp sau.

private string capSentences(string str) 
    { 
     string s = ""; 

     if (str[str.Length - 1] == '.') 
      str = str.Remove(str.Length - 1, 1); 

     char[] delim = { '.' }; 

     string[] tokens = str.Split(delim); 

     for (int i = 0; i < tokens.Length; i++) 
     { 
      tokens[i] = tokens[i].Trim(); 

      tokens[i] = char.ToUpper(tokens[i][0]) + tokens[i].Substring(1); 

      s += tokens[i] + ". "; 
     } 

     return s; 
    } 

Trong ví dụ dưới đây cách nhấp vào nút thực thi mã đơn giản này outBox.Text = capSentences(inBox.Text.Trim()); mà kéo văn bản từ hộp trên và đặt nó trong hộp thấp hơn sau khi các phương pháp trên chạy trên nó.

Sample Program

0

UppercaseWords static String (String BadName) { Chuỗi FullName = "";

 if (BadName != null) 
     { 
      String[] FullBadName = BadName.Split(' '); 
      foreach (string Name in FullBadName) 
      { 
       String SmallName = ""; 
       if (Name.Length > 1) 
       { 
        SmallName = char.ToUpper(Name[0]) + Name.Substring(1).ToLower(); 
       } 
       else 
       { 
        SmallName = Name.ToUpper(); 
       } 
       FullName = FullName + " " + SmallName; 
      } 

     } 
     FullName = FullName.Trim(); 
     FullName = FullName.TrimEnd(); 
     FullName = FullName.TrimStart(); 
     return FullName; 
    } 
+0

bạn có thể sửa định dạng mã? – Fiver

-1

Hãy thử đoạn mã này:

char nm[] = "this is a test"; 

if(char.IsLower(nm[0])) nm[0] = char.ToUpper(nm[0]); 

//print result: This is a test 
+0

char [] nm = "đây là một thử nghiệm". ToCharArray(); sẽ làm việc –

0

chức năng này làm cho vốn chữ cái đầu tiên của tất cả các từ trong một chuỗi

public static string FormatSentence(string source) 
    { 
     var words = source.Split(' ').Select(t => t.ToCharArray()).ToList(); 
     words.ForEach(t => 
     { 
      for (int i = 0; i < t.Length; i++) 
      { 
       t[i] = i.Equals(0) ? char.ToUpper(t[i]) : char.ToLower(t[i]); 
      } 
     }); 
     return string.Join(" ", words.Select(t => new string(t)));; 
    } 
1

tôi sử dụng phiên bản này:

private string FirstLetterCapital(string str) 
     { 
      return Char.ToUpper(str[0]) + str.Remove(0, 1);    
     } 
Các vấn đề liên quan