Come si scrive in maiuscolo il primo carattere di ogni parola o il primo carattere di una stringa intera, con C#?

StackOverflow https://stackoverflow.com/questions/913090

  •  06-09-2019
  •  | 
  •  

Domanda

Potrei scrivere il mio algoritmo di farlo, ma credo che ci dovrebbe essere l'equivalente di ruby umanizzare in C#.

Ho cercato con google ma solo trovato il modo per umanizzare le date.

Esempi:

  • Un modo per trasformare i "Lorem Lipsum Et" in "Lorem lipsum et"
  • Un modo per trasformare i "Lorem lipsum et" in "Lorem Lipsum Et"
È stato utile?

Soluzione

Come discusso nei commenti di @miguel risposta, è possibile utilizzare TextInfo.ToTitleCase che è stato disponibile dal .NET 1.1.Qui è un po ' di codice corrispondente al tuo esempio:

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

Ignorerà l'involucro cose che sono tutte maiuscole come "LOREM LIPSUM ET", perché si sta prendendo cura dei casi se gli acronimi sono nel testo (in modo che "NAMBLA"non diventare "nambla" o "Nambla").

Tuttavia, se si desidera solo maiuscolo il primo carattere che si può fare, la soluzione che è finita qui... oppure si può semplicemente dividere la stringa e capitalizzare il primo della lista:

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 

Altri suggerimenti

Utilizzare le espressioni regolari per questo sembra molto più pulito:

string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());

C'è un'altra soluzione elegante :

Definire la funzione ToTitleCase in un statico classe projet

using System.Globalization;

public static string ToTitleCase(this string title)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title.ToLower()); 
}

E quindi utilizzarlo come una stringa di estensione dovunque sul vostro progetto:

"have a good day !".ToTitleCase() // "Have A Good Day !"

Se si desidera maiuscolo il primo carattere, basta attaccare questo in un metodo di utilità di tua scelta:

return string.IsNullOrEmpty(str) 
    ? str
    : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();

C'è anche una biblioteca metodo di scrivere in maiuscolo il primo carattere di ogni parola:

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

CSS tecnica è ok, ma cambia solo la presentazione della stringa nel browser.Un metodo migliore è quello di rendere il testo in sé capitalizzati prima di inviare al browser.

La maggior parte di sopra implimentations sono ok, ma nessuno di loro affrontare il problema di cosa succede se si dispone di maiuscole e minuscole parole che devono essere conservati, o se si desidera utilizzare il vero Titolo, per esempio:

"Dove Studiare Corsi di Dottorato di ricerca in USA"

o

"Il Modulo IRS UB40a"

Anche utilizzando CultureInfo.CurrentCulture.TextInfo.ToTitleCase(stringa) conserva parole maiuscole come in "sport e MLB di baseball", che diventa "Sport E MLB di Baseball", ma se l'intera stringa viene messo in maiuscolo, quindi questo causa un problema.

Così ho messo insieme una semplice funzione che permette di mantenere il capitale e misto caso le parole e fare piccole parole minuscole (se non all'inizio e alla fine della frase), includendole in un specialCases e utilizza solo caratteri minuscoli matrici di stringhe:

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;
    }

Questo è solo un metodo semplice e veloce, e può probabilmente essere migliorato un po', se volete trascorrere più tempo su di esso.

se si desidera mantenere la capitalizzazione delle piccole parole come "a" e "di" e poi basta rimuovere dall'casi particolari matrice di stringhe.Diverse organizzazioni hanno diverse regole di capitalizzazione.

Si può vedere un esempio di codice in azione su questo sito: La Donazione Di Ovociti, Londra - questo sito crea automaticamente breadcrumb trail in alto delle pagine tramite l'url, ad esempio "/servizi/uk-uovo-banca/introduzione" - poi il nome di ogni cartella nel sentiero ha trattini sostituito con spazi e capitalizza il nome della cartella, in modo da regno unito-uovo-banca diventa UK Banca Uovo.(conservando il maiuscolo "UK")

Un'estensione di questo codice potrebbe essere quello di avere una tabella di ricerca di sigle e lettere maiuscole/minuscole parole in un comune file di testo, tabella di database o di un servizio web in modo che l'elenco di maiuscole e minuscole parole può essere mantenuto da un unico luogo, e si applicano a diverse applicazioni che si basano sulla funzione.

Quanto ne so, non esiste un modo per farlo senza scrivere (o armatura) codice.C# reti (ha!) è superiore, inferiore e il titolo (quello che hai) casi:

http://support.microsoft.com/kb/312890/EN-US/

Non c'è precompilati soluzione per il corretto linguistica captialization in .NET.Che tipo di capitialization stai andando per?Stai seguendo il Chicago Manual of Style convenzioni?AMA o MLA?Perfino la semplice frase in inglese capitalizzazione ha 1000 di eccezioni particolari per le parole.Non posso parlare di ciò che ruby umanizzare, ma immagino che probabilmente non seguire le regole linguistiche di capitalizzazione e di come invece fa qualcosa di molto più semplice.

Internamente, abbiamo riscontrato questo stesso problema e ha dovuto scrivere una quantità abbastanza grande di codice per gestire corretto (nel nostro piccolo) corpo dell'articolo titoli, non ancora, di contabilità per la maiuscola a inizio frase.E, infatti, si ottiene "fuzzy" :)

In realtà dipende da cosa hai bisogno, perché stai cercando di convertire le frasi per la corretta capitalizzazione (e in quale contesto)?

Tutti gli esempi sembrano fare gli altri personaggi abbassato primo che non è quello che mi serviva.

customerName = CustomerName <-- Che è quello che volevo

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top