Je pourrais écrire mon propre algorithme pour le faire, mais je pense qu'il devrait y avoir l'équivalent de humanisation de Ruby en C #.
Je l'ai cherché sur Google, mais je n'ai trouvé que des moyens d'humaniser les dattes.
Exemples:
Comme discuté dans les commentaires de @ la réponse de miguel , vous pouvez utiliser TextInfo.ToTitleCase
qui est disponible depuis .NET 1.1. Voici un code correspondant à votre exemple:
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
Il ignorera les casse qui sont toutes des majuscules comme "LOREM LIPSUM ET" car il s'occupe des cas si les acronymes sont dans le texte (de sorte que " NAMBLA "ne deviendra pas" nambla "ou" Nambla ").
Cependant, si vous souhaitez uniquement mettre en majuscule le premier caractère, vous pouvez faire la solution qui est terminée ici … ou vous pouvez simplement diviser la chaîne et mettre en majuscule le premier de la liste:
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
Utilisez des expressions régulières car cela semble beaucoup plus propre:
string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());
Il existe une autre solution élégante:
Définissez la fonction ToTitleCase
dans une classe statique de votre projet
using System.Globalization;
public static string ToTitleCase(this string title)
{
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title.ToLower());
}
Et puis utilisez-le comme une extension de chaîne n'importe où sur votre projet:
"have a good day !".ToTitleCase() // "Have A Good Day !"
Si vous souhaitez simplement mettre en majuscule le premier caractère, collez-le simplement dans une méthode utilitaire de votre choix:
return string.IsNullOrEmpty(str)
? str
: str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();
Il existe également une méthode de bibliothèque pour mettre en majuscule le premier caractère de chaque mot:
http://msdn.Microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx
La technique CSS est correcte mais ne modifie que la présentation de la chaîne dans le navigateur. Une meilleure méthode consiste à mettre le texte en majuscule avant de l'envoyer au navigateur.
La plupart des implémentations ci-dessus sont correctes, mais aucune d'entre elles ne résout le problème de ce qui se passe si vous avez des mots à casse mixte qui doivent être conservés, ou si vous souhaitez utiliser une véritable casse de titre, par exemple:
"Où étudier les cours de doctorat aux États-Unis"
ou
"Formulaire IRS UB40a"
L'utilisation de CultureInfo.CurrentCulture.TextInfo.ToTitleCase (chaîne) préserve également les mots majuscules comme dans "sports et baseball MLB" qui devient "Sports et baseball MLB" mais si la chaîne entière est mise en majuscules, cela provoque un problème.
J'ai donc mis en place une fonction simple qui vous permet de conserver les mots en majuscules et en minuscules et de faire des petits mots en minuscules (s'ils ne sont pas au début et à la fin de la phrase) en les incluant dans un tableau de chaînes specialCases et 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;
}
C'est juste une méthode simple et rapide - et peut probablement être un peu améliorée si vous voulez y passer plus de temps.
si vous souhaitez conserver la capitalisation de petits mots comme "a" et "de", supprimez-les simplement du tableau de chaînes de cas spéciaux. Différentes organisations ont des règles de capitalisation différentes.
Vous pouvez voir un exemple de ce code en action sur ce site: Egg Donation London - ce site crée automatiquement des pistes de navigation en haut des pages en analysant l'url par exemple "/ services/uk-Egg- bank/introduction "- alors chaque nom de dossier dans la piste a des tirets remplacés par des espaces et met en majuscule le nom du dossier, donc uk-Egg-bank devient UK Egg Bank. (en préservant les majuscules 'UK')
Une extension de ce code pourrait être d'avoir une table de recherche des acronymes et des mots en majuscules/minuscules dans un fichier texte partagé, une table de base de données ou un service Web afin que la liste des mots en casse mixte puisse être conservée à partir d'un seul endroit et s'appliquer à de nombreux différents applications qui dépendent de la fonction.
Il n'y a pas de solution prédéfinie pour une captialisation linguistique appropriée dans .NET. Quel genre de capitialisation allez-vous faire? Suivez-vous les conventions du Chicago Manual of Style? AMA ou MLA? Même la mise en majuscule des phrases en anglais a des milliers d'exceptions spéciales pour les mots. Je ne peux pas parler de ce que Ruby humanise, mais j'imagine qu'il ne suit probablement pas les règles linguistiques de capitalisation et fait plutôt quelque chose de beaucoup plus simple.
En interne, nous avons rencontré ce même problème et avons dû écrire un code de montant assez important juste pour gérer la casse appropriée (dans notre petit monde) des titres d'articles, sans même tenir compte de la capitalisation des phrases. Et ça devient "flou" :)
Cela dépend vraiment de ce dont vous avez besoin - pourquoi essayez-vous de convertir les phrases en capitalisation appropriée (et dans quel contexte)?
Tous les exemples semblent faire baisser les autres personnages en premier, ce qui n'est pas ce dont j'avais besoin.
customerName
= CustomerName
<- C'est ce que je voulais
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();
}
Autant que je sache, il n'y a aucun moyen de le faire sans écrire (ou cribbing) du code. C # filets (ha!) Vos majuscules, minuscules et titres (ce que vous avez):