是否有一种简单的方法可以将字符串的第一个字母大写并降低其余字母?有内置方法吗?还是我需要自己制作?

我对您的特定应用程序一无所知,但我认为应该给出一个一般警告:程序员不应该随意地将此方法应用于实名。我认为老约翰·麦克唐纳会对这种破坏他的名字的方法感到不安,更不用说卡明斯、钟形钩、达纳·博伊德、松本行、姓"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.ToTitleCas‌​e(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;

c语言人名首字母大写,关于字符串:如何在C中大写名字和姓氏的首字母?相关推荐

  1. C语言求姓氏首字母之和,如何在C中大写名字和姓氏的首字母?

    17 回复  |  直到 4 年前 1 255 4 年前 TextInfo.ToTitleCase() 将字符串的每个标记中的第一个字符大写. 如果不需要维护首字母缩略词大写,则应包括 ToLower ...

  2. 如何在JavaScript中大写字符串的首字母

    To capitalize the first letter of a random string, you should follow these steps: 要大写随机字符串的第一个字母,应遵循 ...

  3. android人名排序,android – 如何按搜索栏中的名字和姓氏排序 – Sqlite

    我有一个 Android应用程序,应该取代Android原生联系人. 我想为用户添加基于字符约束搜索用户的可能性. 例如: 这是我的联系人表: id firstName lastName 1. Smi ...

  4. c语言如何扫描一个字符串,如何在C中对单个字符进行扫描

    侃侃无极 首先,避免scanf()..使用它是不值得的痛苦.见:为什么大家都说不要用扫描呢?我应该用什么代替?中使用空白字符.scanf()如果需要读取更多的输入,会忽略输入流中留下的任意数量的空格字 ...

  5. python输出不重复的单词_python-如何在文本文件中创建所有单词的列表,但字母重复的单词除外...

    我正在尝试遍历列表,并将所有单词附加到新列表中,但不包括重复字母的单词. 例: words = ['cat', 'car', 'weevil', 'lizard', 'mammoth', 'cabba ...

  6. java 保留字符串,如何在Java中保留字符串而不使用反转功能

    有以下几种在Java中反转字符串的方法: 使用for循环 使用While循环 使用静态方法 使用For循环 使用for循环在Java中反转字符串的示例 在下面的示例中, 我们使用了for循环来反转字符 ...

  7. java想要生成 字符串,如何在Java中“优雅地”生成String?

    我想生成一个字符串,如sql命令: "INSERT INTO xxx VALUES(XXX, XXX, XXX)" 目前我使用StringBuilder和一些String常量,如& ...

  8. excel 如何替换带上标的文字_如何在Excel中批量提取中文汉字和英文字母

    1. 在数据源的右边分别命名新的两列为"中文名"和"英文名",然后将数据源复制到"中文名"这一列. 2. 为了确保英文名字可以连在一起,这里 ...

  9. python列表输出字符串,如何在python中输出utf-8字符串列表?

    Well, character encoding and decoding sometimes frustrates me a lot. So we know u'\u4f60\u597d' is t ...

  10. c语言scandir函数排序,关于C ++:如何在scandir中参数化选择函数

    scandir()函数扫描目录dir,调用 每个目录项上的select()为" int(* filter)(const struct dirent *)" 如何将模式值作为参数传递 ...

最新文章

  1. 【测试】ESP32天线信号强度比较,小龟小车A2天线esp32cam板载外置天线测试数据...
  2. webpack流程图
  3. 最大公约数 数学,结论 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  4. windows强制复制不计算机,告诉你电脑不能复制粘贴怎么办
  5. Leetcode PHP题解--D6 595. Big Countries
  6. 腾讯CKV海量分布式存储系统
  7. 动态规划入门 合并石子 COGS1660 石子合并
  8. 现在人人都要准备的2020年六个事关职业生涯的技术趋势
  9. JQuery上传插件Uploadify详解及其中文按钮解决方案
  10. java 判断值是否设置,获取Java中“-非法访问”设置的当前值
  11. 安卓加密软件_(安卓)微信聊天加密软件
  12. 不识 Pandas,纵是老手也枉然?
  13. 2015(4)软件工程,软件运行与维护,新旧系统转换策略,遗留系统的演化策略,数据转换与数据迁移...
  14. y400安装dolby方法
  15. 金字塔固定资产管理软件_目前常用固定资产管理软件有哪些?
  16. 快速压缩Word文档的小妙招
  17. Intel出品开源图片标注工具CVAT在Ubuntu18.04上部署
  18. [Mac] OSX 快捷键组合 (完整版)
  19. kaggle员工离职预测案例(3)
  20. HDMI/DVI 显示器热插拔与检测原理(HPD)

热门文章

  1. iOS及Android消息推送方案安装使用入门
  2. excel条件格式标记一整行
  3. linux centos7 安装svn,linux centos7安装svn并配置同步更新web项目
  4. mysql8只有ibd文件_只有ibd文件还能恢复数据吗
  5. 如何把图片上的文字提取出来并转成Word文档
  6. nosqlbooster 延长试用日期
  7. Java工程师的职业规划(最全版本)
  8. java后端getmonth_Java中的MonthDay getMonth()方法
  9. 离散数学之数理逻辑——第2章 命题逻辑等值演算
  10. X-Rover 关建华:所有产品首先要考虑的,永远是用户需求