programacion first capital string language-agnostic format title-case

string - first - title case javascript



Formato de cadena para el título del caso (17)

Aquí hay un método estático simple para hacer esto en C #:

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

¿Cómo puedo formatear una cadena para el título del caso ?


Sería cauteloso de reubicar automáticamente todas las palabras precedidas de espacios en blanco en escenarios donde correría el riesgo de atraer la furia de los quisquillosos.

Al menos consideraría implementar un diccionario para casos de excepción como artículos y conjunciones. Mirad:

"La bella y la Bestia"

Y cuando se trata de nombres propios, la cosa se pone mucho peor.


Sin usar una función preconfigurada, un algoritmo súper simple de bajo nivel para convertir una cadena en un caso de título:

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

Esto supone que el "carácter de conversión a mayúscula" lo hará correctamente independientemente de si el carácter distingue entre mayúsculas y minúsculas (por ejemplo, ''+'').


Para ponerlo en capa, por ejemplo, en C: use los códigos ASCII ( http://www.asciitable.com/ ) para encontrar el valor entero del carácter y reste 32 de él.

Esta es una solución pobre si alguna vez planea aceptar caracteres más allá de az y AZ.

Por ejemplo: ASCII 134: å, ASCII 143: Å.
Usar la aritmética te da: ASCII 102: f

Use las llamadas a la biblioteca, no asuma que puede usar la aritmética de enteros en sus personajes para recuperar algo útil. Unicode es complicado .


Aquí tienes una versión de C ++. Tiene un conjunto de palabras no mayúsculas como prononuns y preposiciones. Sin embargo, no recomendaría automatizar este proceso si tiene que tratar con textos importantes.

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


En Perl:

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

Eso es incluso en las preguntas frecuentes.



En Silverlight no hay ToTitleCase en la clase TextInfo .

Aquí hay una forma simple basada en expresiones regulares.

Nota: Silverlight no tiene expresiones regulares precompiladas, pero para mí esta pérdida de rendimiento no es un problema.

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


Hay una fórmula incorporada PROPER(n) en Excel.

¡Estaba muy contento de ver que no tenía que escribirlo yo mismo!


http://titlecase.com/ tiene una API


Con Perl puedes hacer esto:

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


Si el idioma que está utilizando tiene un método / función admitida, simplemente utilícelo (como en el método C # ToTitleCase )

Si no es así, querrá hacer algo como lo siguiente:

  1. Leer en la cadena
  2. Toma la primera palabra
  3. Poner en mayúscula la primera letra de esa palabra 1
  4. Avanza y encuentra la siguiente palabra
  5. Vaya a 3 si no está al final de la cadena; de lo contrario, salga

1 Para ponerlo en mayúscula, por ejemplo, C: utilice los códigos ascii para encontrar el valor entero del carácter y reste 32 de él.

Tendría que haber mucha más comprobación de errores en el código (asegurando letras válidas, etc.), y la función "Capitalizar" necesitará imponer algún tipo de "esquema de caso de título" en las letras para buscar palabras que no necesitan ser capacitado (''y'', ''pero'' etc. Aquí hay un buen esquema)


¿En que idioma?

En PHP es:

ucwords ()

ejemplo:

$HelloWorld = ucwords(''hello world'');



Creo que usar CultureInfo no siempre es confiable, esta es la forma simple y práctica de manipular la cadena manualmente:

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;


PROPIO como Excel:

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


En Java, puede usar el siguiente código.

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