题
有没有一种简单的方法可以将字符串的第一个字母大写并降低其余字母?有内置方法还是我需要自己制作?
解决方案
TextInfo.ToTitleCase()
将字符串的每个标记中的第一个字符大写。
如果不需要维护 Acronym 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");
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);
上面的代码不会工作......
所以将下面的代码转换为 lower 然后应用该函数
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
A 正则表达式 也可以用 \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
这 正则表达式 可以根据需要进行调整,例如,如果我们想要处理 MacDonald
和 McFry
在这种情况下,正则表达式变为: (?<=\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
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() 应该适合你。
最直接的选择是使用 标题大小写 .NET 中提供的函数在大多数情况下应该处理名称。作为 埃德格 指出有一些名称它不起作用,但这些名称相当罕见,因此除非您针对的是此类名称很常见的文化,否则您不必太担心。
但是,如果您不使用 .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 这样的名字仍然存在问题。
我用我自己的方法来解决这个问题:
例如这句话:“你好世界。你好,这是 stackoverflow 世界。”将是“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;
}
使用 ToTitleCase 的建议不适用于全大写的字符串。因此,您必须对第一个字符调用 ToUpper,对其余字符调用 ToLower。
这堂课就达到了目的。您可以添加新的前缀 _前缀 静态字符串数组。
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);
}
为了解决一些突出显示的问题,我建议首先将字符串转换为小写,然后调用 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;
}