格式化字符串到标题大小写

时间:2008-08-03 16:03:48

标签: string language-agnostic format title-case

如何将字符串格式化为title case

20 个答案:

答案 0 :(得分:16)

这是一个在C#中执行此操作的简单静态方法:

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}

答案 1 :(得分:13)

我会谨慎地自动提升所有空白字母,因为我会冒着吸引挑剔之怒的风险。

我至少会考虑为文章和连词等异常情况实施字典。看哪:

  

“美女与野兽”

当谈到专有名词时,事情变得更加丑陋。

答案 2 :(得分:10)

这是一个Perl解决方案http://daringfireball.net/2008/05/title_case

这是一个Ruby解决方案http://frankschmitt.org/projects/title-case

这是一个Ruby单行解决方案:http://snippets.dzone.com/posts/show/4702

'some string here'.gsub(/\b\w/){$&.upcase}

单行所做的是使用正则表达式替换每个单词的第一个字符及其大写版本。

答案 3 :(得分:8)

  

要在C中使用它,请使用ascii代码(http://www.asciitable.com/)来查找char的整数值并从中减去32。

如果您计划接受超过a-z和A-Z的字符,这是一个很差的解决方案。

例如:ASCII 134:å,ASCII 143:Å。
使用算术可以得到:ASCII 102:f

使用库调用,不要假设您可以对字符使用整数运算来获取有用的东西。 Unicode是tricky

答案 4 :(得分:6)

在Silverlight中,ToTitleCase类中没有TextInfo

这是一种基于正则表达式的简单方法。

注意:Silverlight没有预编译的正则表达式,但对我来说,性能损失不是问题。

    public string TitleCase(string str)
    {
        return Regex.Replace(str, @"\w+", (m) =>
        {
            string tmp = m.Value;
            return char.ToUpper(tmp[0]) + tmp.Substring(1, tmp.Length - 1).ToLower();
        });
    }

答案 5 :(得分:5)

在Java中,您可以使用以下代码。

public String titleCase(String str) {
    char[] chars = str.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (i == 0) {
            chars[i] = Character.toUpperCase(chars[i]);
        } else if ((i + 1) < chars.length && chars[i] == ' ') {
            chars[i + 1] = Character.toUpperCase(chars[i + 1]);
        }
    }
    return new String(chars);
}

答案 6 :(得分:5)

Perl:

$string =~ s/(\w+)/\u\L$1/g;

甚至在FAQ中也是如此。

答案 7 :(得分:5)

用什么语言?

在PHP中它是:

ucwords()

示例:

$HelloWorld = ucwords('hello world');

答案 8 :(得分:5)

如果您使用的语言具有受支持的方法/功能,那么只需使用它(如在C#ToTitleCase方法中)

如果没有,那么您将需要执行以下操作:

  1. 读入字符串
  2. 取第一个字
  3. 将该词的首字母大写 1
  4. 前进,找到下一个单词
  5. 如果不在字符串的末尾,请转到3,否则退出
  6. 1 要将其大写,例如,C - 使用ascii codes查找char的整数值并从中减去32。

    在代码中需要进行更多的错误检查(确保有效的字母等),并且“大写”功能需要在字母上施加某种“标题案例方案”以检查单词不需要被限制('和','但'等等Here是一个很好的计划)

答案 9 :(得分:4)

Excel-like PROPER:

public static string ExcelProper(string s) {
    bool upper_needed = true;
    string result = "";
    foreach (char c in s) {
        bool is_letter = Char.IsLetter(c);
        if (is_letter)
            if (upper_needed)
                result += Char.ToUpper(c);
            else
                result += Char.ToLower(c);
        else
            result += c;
        upper_needed = !is_letter;
    }
    return result;
}

答案 10 :(得分:2)

http://titlecase.com/有一个API

答案 11 :(得分:1)

以下是一个如何操作的简单示例:

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}

答案 12 :(得分:1)

Excel中有一个内置公式PROPER(n)

很高兴看到我自己不必写它!

答案 13 :(得分:1)

我认为使用CultureInfo并不总是可靠的,这是手动操作字符串的简单方便的方法:

string sourceName = txtTextBox.Text.ToLower();
string destinationName = sourceName[0].ToUpper();

for (int i = 0; i < (sourceName.Length - 1); i++) {
  if (sourceName[i + 1] == "")  {
    destinationName += sourceName[i + 1];
  }
  else {
    destinationName += sourceName[i + 1];
  }
}
txtTextBox.Text = desinationName;

答案 14 :(得分:1)

这是Python中的一个实现:https://launchpad.net/titlecase.py

我在C ++中完成的这个实现的端口:http://codepad.org/RrfcsZzO

答案 15 :(得分:0)

在C#中,您可以简单地使用

CultureInfo.InvariantCulture.TextInfo.ToTitleCase(str.ToLowerInvariant())
  • 不变
  • 使用大写字符串

答案 16 :(得分:0)

在C#中

using System.Globalization;  
using System.Threading;  
protected void Page_Load(object sender, EventArgs e)  
{  
  CultureInfo cultureInfo   = Thread.CurrentThread.CurrentCulture;  
  TextInfo textInfo = cultureInfo.TextInfo;  
  Response.Write(textInfo.ToTitleCase("WelcometoHome<br />"));  
  Response.Write(textInfo.ToTitleCase("Welcome to Home"));  
Response.Write(textInfo.ToTitleCase("Welcome@to$home<br/>").Replace("@","").Replace("$", ""));  
}

答案 17 :(得分:-1)

使用perl你可以这样做:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;

答案 18 :(得分:-1)

这里有一个C ++版本。它有一组非上位词,如prononuns和介词。但是,如果您要处理重要文本,我不建议自动执行此过程。

#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <set>

using namespace std;

typedef vector<pair<string, int> > subDivision;
set<string> nonUpperCaseAble;

subDivision split(string & cadena, string delim = " "){
    subDivision retorno;
    int pos, inic = 0;
    while((pos = cadena.find_first_of(delim, inic)) != cadena.npos){
        if(pos-inic > 0){
            retorno.push_back(make_pair(cadena.substr(inic, pos-inic), inic));
        }
        inic = pos+1;
    }
    if(inic != cadena.length()){
        retorno.push_back(make_pair(cadena.substr(inic, cadena.length() - inic), inic));
    }
    return retorno;
}

string firstUpper (string & pal){
    pal[0] = toupper(pal[0]);
    return pal;
}

int main()
{
    nonUpperCaseAble.insert("the");
    nonUpperCaseAble.insert("of");
    nonUpperCaseAble.insert("in");
    // ...

    string linea, resultado;
    cout << "Type the line you want to convert: " << endl;
    getline(cin, linea);

    subDivision trozos = split(linea);
    for(int i = 0; i < trozos.size(); i++){
        if(trozos[i].second == 0)
        {
            resultado += firstUpper(trozos[i].first);
        }
        else if (linea[trozos[i].second-1] == ' ')
        {
            if(nonUpperCaseAble.find(trozos[i].first) == nonUpperCaseAble.end())
            {
                resultado += " " + firstUpper(trozos[i].first);
            }else{
                resultado += " " + trozos[i].first;
            }
        }
        else
        {
            resultado += trozos[i].first;
        }       
    }

    cout << resultado << endl;
    getchar();
    return 0;
}

答案 19 :(得分:-1)

不使用现成的函数,将字符串转换为标题大小写的超简单低级算法:


convert first character to uppercase.
for each character in string,
    if the previous character is whitespace,
        convert character to uppercase.

无论字符是否区分大小写(例如,'+'),这将“将字符转换为大写字母”将正确地执行此操作。