Pregunta

¿Cómo le doy formato a una cadena para titulo del caso?

No hay solución correcta

Otros consejos

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

Sería cauteloso al poner a mayúsculas automáticamente todas las palabras precedidas por espacios en blanco en escenarios en los que correría el riesgo de atraer la furia de los quisquillosos.

Al menos consideraría implementar un diccionario para casos excepcionales como artículos y conjunciones.Mirad:

"La bella y la Bestia"

Y cuando se trata de nombres propios, la cosa se pone mucho más fea.

Aquí hay una solución Perl http://daringfireball.net/2008/05/title_case

Aquí hay una solución Ruby http://frankschmitt.org/projects/title-case

Aquí hay una solución de una sola línea de Ruby: http://snippets.dzone.com/posts/show/4702

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

Lo que hace el resumen es utilizar una expresión regular que sustituye el primer carácter de cada palabra por la versión mayúscula de la misma.

Para capatilizarlo en, digamos, C, utilice los códigos ASCII (http://www.asciitable.com/) para encontrar el valor entero del char y restarle 32.

Esta es una mala solución si alguna vez planea aceptar caracteres más allá de a-z y A-Z.

Por ejemplo:ASCII 134:å, ASCII 143:A.
Usar la aritmética te permite:ASCII 102:F

Utilice llamadas a la biblioteca, no asuma que puede utilizar la aritmética de enteros en sus personajes para obtener algo útil.Unicode es complicado.

En Silverlight no hay ToTitleCase en el TextInfo clase.

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

En Perl:

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

Eso está incluso en las preguntas frecuentes.

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

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

  1. Leer en la cadena
  2. Toma la primera palabra
  3. Escribe 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 en, digamos, C, use el codigos ascii para encontrar el valor entero del char y restarle 32.

Se necesitaría mucha más verificació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 título y mayúsculas" en las letras para verificar palabras que no necesitan ser capatilizado ('y', 'pero', etc. Aquí es un buen esquema)

¿En que idioma?

En PHP es:

ucpalabras()

ejemplo:

$HelloWorld = ucwords('hello world');

En Java, puede utilizar 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);
}

APROPIADO similar a 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;
}

http://titlecase.com/ tiene un API

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

¡Me alegró mucho ver que no tuve que escribirlo yo mismo!

Aquí hay una implementación en Python: https://launchpad.net/titlecase.py

Y una adaptación de esta implementación que acabo de hacer en C++: http://codepad.org/RrfcsZzO

Creo que usar CultureInfo no siempre es confiable, esta es la forma simple y práctica de manipular cadenas 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;

A continuación se muestra un ejemplo sencillo de cómo hacerlo:

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

Sin utilizar una función lista para usar, un algoritmo súper simple de bajo nivel para convertir una cadena a mayúsculas y minúsculas:


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

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

Aquí tienes una versión C++.Tiene un conjunto de palabras que no se pueden escribir en mayúsculas, como pronombres y preposiciones.Sin embargo, no recomendaría automatizar este proceso si va a 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;
}

Con Perl puedes hacer esto:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top