30

文字列をタイトルケースにフォーマットするにはどうすればよいですか?

4

20 に答える 20

16

これをC#で行う簡単な静的メソッドは次のとおりです。

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}
于 2008-08-03T16:05:57.537 に答える
13

ニトピッカーの怒りを引き付けるリスクを冒すシナリオでは、すべての空白の前の単語を自動的にアップケースすることに注意します。

少なくとも、冠詞や接続詞などの例外的な場合に辞書を実装することを検討します。見よ:

"美女と野獣"

そして、適切な名詞になると、物事ははるかに醜くなります。

于 2008-08-03T19:10:58.723 に答える
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}

ワンライナーが行っているのは、各単語の最初の文字を大文字で正規表現で置換することです。

于 2008-08-03T18:22:47.213 に答える
8

たとえば、Cでそれを大文字にするには、ASCIIコード(http://www.asciitable.com/)を使用してcharの整数値を見つけ、そこから32を引きます。

これは、azおよびAZ以外の文字を受け入れることを計画している場合には不十分な解決策です。

例:ASCII 134:å、ASCII 143:Å。
算術演算を使用すると、次のようになります。ASCII 102:f

ライブラリ呼び出しを使用します。文字に整数演算を使用して、何か便利なものを取り戻すことができると思い込まないでください。Unicodeは注意が必要です。

于 2008-08-04T21:16:22.760 に答える
6

SilverlightToTitleCaseでは、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();
        });
    }
于 2010-06-09T04:24:08.593 に答える
5

どの言語で?

PHPでは次のようになります。

ucwords()

例:

$HelloWorld = ucwords('hello world');
于 2008-08-03T16:12:43.747 に答える
5

使用している言語にサポートされているメソッド/関数がある場合は、それを使用してください(C#ToTitleCaseメソッドのように)

そうでない場合は、次のようなことを行う必要があります。

  1. 文字列を読み取る
  2. 最初の言葉を取る
  3. その単語の最初の文字を大文字にする1
  4. 先に進み、次の単語を見つけます
  5. 文字列の最後でない場合は3に進み、そうでない場合は終了します

1たとえば、Cで大文字にするには、ASCIIコードを使用してcharの整数値を見つけ、そこから32を引きます。

コードでさらに多くのエラーチェックを行う必要があり(有効な文字を確認するなど)、「Capitalize」関数は、不要な単語をチェックするために、文字に何らかの「タイトルケーススキーム」を課す必要があります。大文字にする(「and」、「but」など。これが良いスキームです

于 2008-08-03T16:33:51.193 に答える
5

Perlの場合:

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

それはFAQにもあります。

于 2008-09-29T22:35:06.873 に答える
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);
}
于 2016-03-02T10:32:44.070 に答える
4

Excel ライクな 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;
}
于 2011-03-02T22:29:42.833 に答える
2

http://titlecase.com/APIを持っています

于 2010-06-09T04:09:49.593 に答える
1

PROPER(n)Excelには組み込みの数式があります。

自分で書く必要がないのを見て、とてもうれしかったです!

于 2010-06-09T04:07:56.463 に答える
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;
于 2009-12-07T16:56:51.797 に答える
-1

perlを使用すると、これを行うことができます。

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
于 2008-09-16T11:11:27.223 に答える
-1

既製の関数を使用せずに、文字列をタイトルケースに変換するための超シンプルな低レベルアルゴリズム:


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

これは、文字が大文字と小文字を区別するかどうかに関係なく、「文字を大文字に変換」が正しく実行することを前提としています(たとえば、「+」)。

于 2008-08-03T16:25:07.700 に答える
-1

Here you have a C++ version. It's got a set of non uppercaseable words like prononuns and prepositions. However, I would not recommend automating this process if you are to deal with important texts.

#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;
}
于 2008-09-29T23:27:40.743 に答える