Format řetězec titulní případu

hlasů
24

Jak mohu formátovat řetězec na titulní případ ?

Položena 03/08/2008 v 17:03
zdroj uživatelem
V jiných jazycích...                            


18 odpovědí

hlasů
16

Zde je jednoduchý statický způsob, jak to udělat v C #:

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}
Odpovězeno 03/08/2008 v 17:05
zdroj uživatelem

hlasů
13

Byl bych opatrný automaticky upcasing všech mezer, předcházela-slova ve scénářích, kde bych hrozí, že přitahuje zuřivost nitpickers.

Chtěl bych alespoň uvažovat o zavedení slovník pro případy výjimek, jako jsou články a spojek. Spatřit:

"Kráska a zvíře"

A pokud jde o vlastní jména, ta věc dostane mnohem ošklivější.

Odpovězeno 03/08/2008 v 20:10
zdroj uživatelem

hlasů
10

Zde je řešení Perl http://daringfireball.net/2008/05/title_case

Zde je řešení Ruby http://frankschmitt.org/projects/title-case

Tady je Ruby jednořádkový řešení: http://snippets.dzone.com/posts/show/4702

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

Co se one-liner dělá, je pomocí regulárních výrazů substituci první znak každého slova s ​​velkými písmeny verzi.

Odpovězeno 03/08/2008 v 19:22
zdroj uživatelem

hlasů
8

Aby capatilise ho, řekněme, C - používat ASCII kódy ( http://www.asciitable.com/ ) najít celočíselnou hodnotu z dřevěného uhlí a odečíst 32 od něj.

To je špatná řešení, pokud jste někdy v plánu přijímat znaky, které přesahují AZ a společnosti AZ.

Například: ASCII 134: A, ASCII 143: a.
Pomocí aritmetiky vás dostane: ASCII 102: f

Používat knihovny volání, nenesou můžete použít celočíselné aritmetiky na vaší postavy vrátit něco užitečného. Unicode je ošidné .

Odpovězeno 04/08/2008 v 22:16
zdroj uživatelem

hlasů
6

V Java, můžete použít následující kód.

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);
}
Odpovězeno 02/03/2016 v 10:32
zdroj uživatelem

hlasů
6

Silverlight není ToTitleCaseve TextInfotřídě.

Zde je jednoduchý způsob, jak regex založené.

Poznámka: Silverlight nemá předkompilovaný regexes, ale pro mě je to ztráta výkonu není problém.

    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();
        });
    }
Odpovězeno 09/06/2010 v 05:24
zdroj uživatelem

hlasů
5

Perl:

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

To je dokonce ve FAQ.

Odpovězeno 29/09/2008 v 23:35
zdroj uživatelem

hlasů
5

Pokud jazyk, který používáte má podporovaný způsob / funkce pak stačí použít že (stejně jako v C # ToTitleCasemetody)

Pokud tomu tak není, pak se budete chtít udělat něco jako následující:

  1. Přečíst v řetězci
  2. Vezměte první slovo
  3. První písmeno tohoto slova 1
  4. Jděte kupředu a najít další slovo
  5. ne-li jít až 3 na konci řetězce, jinak výjezd

1 Chcete-li využít to, řekněme, C - používat ASCII kódy najít celočíselnou hodnotu z dřevěného uhlí a odečíst 32 od něj.

Tam by musela být kontrola v kódu (zajištění platné dopisy atd) mnohem více chyb, a funkce „Velká“ bude muset zavést jakési „titulní případ režimu“ na dopisy pro kontrolu slova, která nepotřebují se capatilised ( ‚a‘, ‚ale‘ atd. Zde je dobré schéma)

Odpovězeno 03/08/2008 v 17:33
zdroj uživatelem

hlasů
5

V jakém jazyce?

V PHP je:

ucwords ()

příklad:

$HelloWorld = ucwords('hello world');
Odpovězeno 03/08/2008 v 17:12
zdroj uživatelem

hlasů
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;
}
Odpovězeno 02/03/2011 v 23:29
zdroj uživatelem

hlasů
2

http://titlecase.com/API

Odpovězeno 09/06/2010 v 05:09
zdroj uživatelem

hlasů
1

Zde je jednoduchý příklad toho, jak na to:

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}
Odpovězeno 15/12/2017 v 11:54
zdroj uživatelem

hlasů
1

Zde je implementace v jazyce Python: https://launchpad.net/titlecase.py

A port tohoto plnění, které jsem právě udělal v jazyce C ++: http://codepad.org/RrfcsZzO

Odpovězeno 19/11/2012 v 08:59
zdroj uživatelem

hlasů
1

K dispozici je vestavěný vzorec PROPER(n)v Excelu.

Byl docela rád, jsem nemusel psát to sám!

Odpovězeno 09/06/2010 v 05:07
zdroj uživatelem

hlasů
1

Myslím, že s použitím CultureInfo není vždy spolehlivé, o tento jednoduchý a praktický způsob, jak manipulovat řetězec ručně:

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;
Odpovězeno 07/12/2009 v 17:56
zdroj uživatelem

hlasů
-1

Zde máte C ++ verze. Má to řadu non uppercaseable slova jako prononuns a předložky. Nicméně bych nedoporučoval automatizaci tohoto procesu, pokud jste se vypořádat s významnými texty.

#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;
}
Odpovězeno 30/09/2008 v 00:27
zdroj uživatelem

hlasů
-1

S perl byste mohli udělat toto:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Odpovězeno 16/09/2008 v 12:11
zdroj uživatelem

hlasů
-1

Bez použití ready-made funkci super-jednoduchý algoritmus low-level převést řetězec na titulní věci:


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

To asssumes dále jen „převést znak na velká písmena“ to udělá správně, bez ohledu na to, zda je či není znak je malá a velká písmena (například ‚+‘).

Odpovězeno 03/08/2008 v 17:25
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more