是否有一种简单的方法可以将字符串的第一个字母大写并降低其余字母?有内置方法吗?还是我需要自己制作?
我对您的特定应用程序一无所知,但我认为应该给出一个一般警告:程序员不应该随意地将此方法应用于实名。我认为老约翰·麦克唐纳会对这种破坏他的名字的方法感到不安,更不用说卡明斯、钟形钩、达纳·博伊德、松本行、姓"von"的人、姓"o'doyle"的人等等。大多数名字都不是大写的"first last"格式;我建议d阅读kalzumeus.com/2010/06/17/…
@尼克是绝对正确的。你甚至不能假设小写字母后接大写字母是错误的-爱尔兰人的名字做的事情像"&211;hairt"。假设对于任何你能想到的惯例,有一种文化/语言会让你吃惊。
第一TextInfo.ToTitleCase()capitalizes令牌字符串中每一字符。
如果有需要,以维持在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链接的详细描述。
这里要注意的一点是,如果字符串都是大写的,它就不起作用。它认为所有的大写字母都是首字母缩写。
我看到的许多情况是你不能依赖它们。如果这个名字像麦凯恩,或者你开始打更多的外国名字,这是行不通的。
@roosa-很容易修复这个toitlecase(val.tolower())
+我知道它已经在FCL里了,谷歌把我带到这里=d
与下面Nathan的回答不同,我得到了一个错误:"不幸的是,非静态字段、方法或属性……"需要对象引用。
@danw支持.microsoft.com/kb/312890
在作者的辩护中,不正确的代码是由一位编辑在几年前的原始文章中添加的,但是我已经纠正了它,以避免进一步的混淆。
@西蒙·韦弗,你的评论帮助我解决了It thinks that all caps is an acronym.警告。谢谢!
如果是"约翰·多伊",这个就不起作用了……它会返回"约翰·杜"
也许你应该在做新的评论之前先阅读其他的评论。上面回答了两次。
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
哇!好答案。我总是忘记全球化的东西。
很好的解决方案!在vb.net中:sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case。
您需要检测每个单独名称的区域性,而不是当前区域性。这不适用于名字。
由于这依赖于CurrentCulture,我们如何才能确保没有文化能够以不同的方式处理这一问题?
String test ="HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);
上述代码wont工作……
把下面的代码的操作系统,然后通过转换到较低的应用功能
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
regex还可以用\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的情况,可以根据需要调整regex,regex变成:(?<=\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)。
最后,我们可以认识到,这个regex也将与最后一个's的MacDonald'S匹配,所以我们需要在regex中处理它,在(?后面有一个否定的外观。最后我们有:
string input ="o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](? m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry
@polkduran我正在努力寻找一种方法来处理名称末尾的罗马数字;我想把它们全部大写:john smith iii。后面的否定会影响这一点吗?
就像往常一样,我终于能够回答自己的问题了。我添加了一个可选组来匹配罗马数字(将得到大写)。这是我现在使用的完整regex:(?
您的情况是一个特殊的情况,答案中的regex将每个名称(姓氏)视为输入字符串中的一个独立单词(测试输入字符串有多个名称),因此它没有"名称结束"的概念。如果将输入字符串视为单个名称,则可以在regex前面加上一个简单的条件来处理您的情况:\b[ivxlcdm]+$|,这样您就有了\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?。它将构成一个名称的所有结束词,该名称具有不严格的罗马数字格式(ivxlcdm)。但是,您可能会得到一些不期望的结果,例如"li"将变为"li"
有趣。我认为你的添加在结构上可能更正确,但我同意…我认为你会提出一些问题。在上面的解决方案中,我将后缀硬编码为"ix",这在我的情况下有效,但我认识到可能不适合每个人。
有些人在遇到问题时会想:"我知道,我会用正则表达式。"现在他们有两个问题。
@davidcalke有时候是这样的,你也可以实现你自己的算法,这是一个相对简单的regex。当人们不知道如何使用它时,他们就会这么说。例如,我遇到过这样的人。
我同意,我喜欢正则表达式,但在我对自己正在做的事情有所了解之前,我读了一读Mastering Regular Expressions。另外,了解何时将它们应用到问题上是很重要的,因为如果将它们用于具有高通量的问题,它们可能很脆弱。
不适合"约翰·杜"
@Si8,你测试过了吗?Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](? m.Value.ToUpper())
我没有那样做,但让我试试。谢谢。
MC和MAC是prefixes普通姓氏在美国,和有其他人。是不是把那些textinfo.totitlecase案件和不被用于这一目的的T。这是怎么我做它
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()的工作。
support.microsoft.com http:/ / / / 312890 KB
最直接的选择是要使用的功能是totitlecase是可用的网络名称,应该照顾大部分时间。有一些尖的边缘,它的名字是不会工作的,但这些都是罕见的,除非你是fairly操作系统名称,如靶向的文化是必要的,它不是一个普通的东西,你有什么担心的太多了。
然而,如果你的工作是不是与.NET语言,那么它取决于什么样的投入上看,如果你有两个单独的域的第一名称和最后的名称,然后你可以只利用了第一个下的其余substrings它使用。
firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();
然而,如果你设置多个名称相同的字符串的一部分,然后你要知道你得到的信息,与它相应的分裂。所以,如果你要在你的名字一样,"约翰"的基础上,在空间的分割字符串的字符。如果它是在格式如"约翰多伊,你将需要"基于逗号分割它。然而,一旦你有它,你只是利用分裂中所示的代码。
我用我自己的方法来得到这个固定。
例如:"Hello World"的说法。这是世界的"计算器"将"Hello World。。。。。。。。。。。。。。这是"计算器"的世界。。。。。。。。。。。。。。正则表达式(开始 b W(字)的第一特征字)将的戏法。
///
/// Makes each first letter of a word uppercase. The rest will be lowercase
///
///
///
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;
}
cultureinfo.currentculture.textinfo.totitlecase("我的名字");
返回我的名字
但问题仍然存在与类的名称表示,早期的小飞侠。
McFry!Konichiwa,Fugitsu San先生
@大卫C尝试用空替换空格!!like string.replace('','')
这类做把戏。你可以添加新的_ prefixes 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不会串,都是工作上的情况。所以,你要会写的第一个字符的在线和电话同时在线剩下的字符。
为什么不在调用toitlecase之前先调用输入字符串上的tolower?
如果你使用vs2k8,你可以使用一个扩展的DDA方法:它的字符串类
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-input.FirstLetterToUpper()当然比Char.ToUpper(input[0]) + input.Substring(1)更易读,但透明度较低。
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;
}
得圆一些的问题/问题,我会有一个本highlighted suggest转换字符串,然后调用到下一totitlecase案例的方法。然后你可以使用返回返回("MC")或("")来确定需要更多的关注这一特殊案例的特异性。
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);
电火花显示类,你需要更复杂的算法来处理特殊的名字(这可能是为什么很多地方都对上力的案例)。
像这样的东西untested C #应该简单的案例:把你的请求
public string SentenceCase(string input)
{
return input(0, 1).ToUpper + input.Substring(1).ToLower;
}
忘记这一点——使用全球化类stackoverflow.com/questions/72831/&hellip;