如何在C#中将大写的名字和姓氏大写?
有没有一种简单的方法可以大写字符串的第一个字母并降低其余的字母?是否有内置方法或者需要自己制作?
解决方案
回答
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());
有关详细说明,请参见MSDN链接。
回答
ToTitleCase()应该适合我们。
http://support.microsoft.com/kb/312890
回答
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
回答
最直接的选择是使用.NET中提供的ToTitleCase函数,该函数在大多数情况下应使用该名称。正如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"之类的格式,则需要根据逗号对它进行拆分。但是,一旦将其拆分,就可以应用前面显示的代码。
回答
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("我的名字");
返回〜我的名字
但是,像前面提到的McFly这样的名称仍然存在问题。
回答
如果我们使用的是vS2k8,则可以使用扩展方法将其添加到String类:
public static string FirstLetterToUpper(this String input) { return input = input.Substring(0, 1).ToUpper() + input.Substring(1, input.Length - 1); }
回答
就像edg所示,我们将需要一种更复杂的算法来处理特殊名称(这可能就是为什么许多地方将所有内容都强制使用大写形式的原因)。
像这样未经测试的c应该可以处理我们请求的简单情况:
public string SentenceCase(string input) { return input(0, 1).ToUpper + input.Substring(1).ToLower; }
回答
使用ToTitleCase的建议不适用于全部为大写的字符串。因此,我们将必须在第一个字符上调用ToUpper,在其余字符上调用ToLower。
回答
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; }
回答
该类可以解决问题。我们可以向_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(); } }
回答
为了解决一些突出显示的问题/问题,我建议先将字符串转换为小写,然后再调用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); }
回答
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());