在 C # 中如何将名和姓的首字母大写?

有没有一种简单的方法可以将字符串的第一个字母大写,然后将其余的字母降低?是否有一个内置的方法,或者我需要自己制作?

135906 次浏览

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 应该照顾名称的大部分时间。正如 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”这样的格式,则需要根据逗号对其进行分割。但是,一旦将它分开,您只需应用前面所示的代码。

文化信息。当前文化。文本信息。 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 是常见的姓氏前缀,还有其他的。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;
}

这个类可以解决这个问题。您可以向 _ 前缀静态字符串数组添加新的前缀。

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();
}
}

为了避免一些 ben 强调的问题,我建议首先将字符串转换为小写,然后调用 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());

我用自己的方法解决了这个问题:

例如这句话: “ hello world。你好,这是堆栈溢出的世界。”将会是“ Hello World”。你好,这里是 Stackoverflow 世界。”.正则表达式 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;
}

我喜欢这样:

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);

有些情况下,CultureInfo.CurrentCulture.TextInfo.ToTitleCase不能处理,例如: 撇号 '

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

正则表达式也可以用 \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

如果需要,可以对 正则表达式进行调优,例如,如果我们希望处理正则表达式变成的 MacDonaldMcFry情况: (?<=\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)

最后,我们可以认识到,这个 正则表达式也将匹配的情况下 MacDonald'S的最后一个 's,所以我们需要处理它在 正则表达式与负面的看后面的 (?<!'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
 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;


}