我可以编写自己的算法来做到这一点,但我觉得应该等效于C#中的ruby人性化。
我用谷歌搜索,但只找到人性化日期的方法。
例子:
- 一种将“ Lorem Lipsum Et”转换为“ Lorem Lipum et”的方法
- 一种将“ Lorem Lipum et”转换为“ Lorem Lipsum Et”的方法
我可以编写自己的算法来做到这一点,但我觉得应该等效于C#中的ruby人性化。
我用谷歌搜索,但只找到人性化日期的方法。
例子:
Answers:
如@miguel答案的注释中所述,您可以使用TextInfo.ToTitleCase
.NET 1.1以来可用的功能。这是与您的示例相对应的一些代码:
string lipsum1 = "Lorem lipsum et";
// Creates a TextInfo based on the "en-US" culture.
TextInfo textInfo = new CultureInfo("en-US",false).TextInfo;
// Changes a string to titlecase.
Console.WriteLine("\"{0}\" to titlecase: {1}",
lipsum1,
textInfo.ToTitleCase( lipsum1 ));
// Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et
它将忽略全部为大写的大写字母,例如“ LOREM LIPSUM ET”,因为它会处理首字母缩写词在文本中的情况(以使“ NAMBLA ”不会成为“ nambla”或“ Nambla”)。
但是,如果您只想大写第一个字符,则可以执行此处的解决方案……或者您可以拆分字符串并大写列表中的第一个字符:
string lipsum2 = "Lorem Lipsum Et";
string lipsum2lower = textInfo.ToLower(lipsum2);
string[] lipsum2split = lipsum2lower.Split(' ');
bool first = true;
foreach (string s in lipsum2split)
{
if (first)
{
Console.Write("{0} ", textInfo.ToTitleCase(s));
first = false;
}
else
{
Console.Write("{0} ", s);
}
}
// Will output: Lorem lipsum et
使用正则表达式可以使它看起来更简洁:
string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());
Regex.Replace(s, @"\b([a-z])", m => m.Value.ToUpper())
还有另一个优雅的解决方案:
ToTitleCase
在projet的静态类中定义函数
using System.Globalization;
public static string ToTitleCase(this string title)
{
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title.ToLower());
}
然后在项目的任何位置将其用作字符串扩展名:
"have a good day !".ToTitleCase() // "Have A Good Day !"
title.ToLower()
前使用ToTitleCase
。否则大写字母将不会被替换。
如果只想大写第一个字符,只需将其放在自己的实用程序方法中即可:
return string.IsNullOrEmpty(str)
? str
: str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();
还有一个库方法可以将每个单词的首字母大写:
http://msdn.microsoft.com/zh-CN/library/system.globalization.textinfo.totitlecase.aspx
CSS技术是可以的,但只能更改浏览器中字符串的表示形式。更好的方法是在发送到浏览器之前使文本本身大写。
上面的大多数暗示都是可以的,但是如果您混合使用需要保留的大小写单词,或者您想使用真正的标题大小写,则上述任何一种含义都无法解决,例如:
“在美国哪里学习博士学位课程”
要么
“ IRS表格UB40a”
同样使用CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string)保留大写单词,如在“体育和MLB棒球”中一样,该单词变为“体育和MLB棒球”,但是如果将整个字符串都放在大写中,则会引起问题。
因此,我整理了一个简单的函数,通过将它们包含在specialCases和lowerCases字符串数组中,可以使大写字母和大小写混合的单词保持小写(如果它们不在短语的开头和结尾)为小写:
public static string TitleCase(string value) {
string titleString = ""; // destination string, this will be returned by function
if (!String.IsNullOrEmpty(value)) {
string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title
string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title
string[] words = value.ToLower().Split(' ');
bool wordAdded = false; // flag to confirm whether this word appears in special case list
int counter = 1;
foreach (string s in words) {
// check if word appears in lower case list
foreach (string lcWord in lowerCases) {
if (s.ToLower() == lcWord) {
// if lower case word is the first or last word of the title then it still needs capital so skip this bit.
if (counter == 0 || counter == words.Length) { break; };
titleString += lcWord;
wordAdded = true;
break;
}
}
// check if word appears in special case list
foreach (string scWord in specialCases) {
if (s.ToUpper() == scWord.ToUpper()) {
titleString += scWord;
wordAdded = true;
break;
}
}
if (!wordAdded) { // word does not appear in special cases or lower cases, so capitalise first letter and add to destination string
titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower();
}
wordAdded = false;
if (counter < words.Length) {
titleString += " "; //dont forget to add spaces back in again!
}
counter++;
}
}
return titleString;
}
这只是一种快速而简单的方法-如果您想花更多的时间,可能会有所改进。
如果要保留较小的单词(例如“ a”和“ of”)的大写字母,则只需将它们从特殊情况的字符串数组中删除。不同的组织在资本化方面有不同的规则。
您可以在以下站点上看到此代码的示例:伦敦鸡蛋捐赠-该站点通过解析url(例如“ / services / uk-egg-bank / introduction”)在页面顶部自动创建面包屑跟踪-然后每个路径中的文件夹名称用连字符替换为空格并大写了文件夹名称,因此uk-egg-bank成为UK Egg Bank。(保留大写的“ UK”)
此代码的扩展可能是在共享文本文件,数据库表或Web服务中具有一个首字母缩略词和大写/小写单词的查找表,以便可以从一个位置维护混合大小写单词的列表,并将其应用于许多不同的位置依赖该功能的应用程序。
所有这些示例似乎都使其他字符降低了,这不是我所需要的。
customerName
= CustomerName
<-我想要的是
this is an example
= This Is An Example
public static string ToUpperEveryWord(this string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
return string.Empty;
}
var words = s.Split(' ');
var t = "";
foreach (var word in words)
{
t += char.ToUpper(word[0]) + word.Substring(1) + ' ';
}
return t.Trim();
}
使用自定义扩展方法已经实现了相同的目的。对于First子字符串的First Letter,请使用method yourString.ToFirstLetterUpper()
。对于不包含文章和某些命题的每个子字符串的首字母,请使用方法yourString.ToAllFirstLetterInUpper()
。下面是一个控制台程序:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("this is my string".ToAllFirstLetterInUpper());
Console.WriteLine("uniVersity of lonDon".ToAllFirstLetterInUpper());
}
}
public static class StringExtension
{
public static string ToAllFirstLetterInUpper(this string str)
{
var array = str.Split(" ");
for (int i = 0; i < array.Length; i++)
{
if (array[i] == "" || array[i] == " " || listOfArticles_Prepositions().Contains(array[i])) continue;
array[i] = array[i].ToFirstLetterUpper();
}
return string.Join(" ", array);
}
private static string ToFirstLetterUpper(this string str)
{
return str?.First().ToString().ToUpper() + str?.Substring(1).ToLower();
}
private static string[] listOfArticles_Prepositions()
{
return new[]
{
"in","on","to","of","and","or","for","a","an","is"
};
}
}
输出值
This is My String
University of London
Process finished with exit code 0.
据我所知,没有编写(或抄写)代码的方法是没有办法的。C#净(ha!)大写,小写和标题(所拥有的)情况: