Aquí podría ser tu PUBLICIDAD


Formato de cadena para el título del caso

votos
24

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

Publicado el 03/08/2008 a las 17:03
fuente por usuario tags2k
En otros idiomas...        العربية       

18 respuestas

votos
16

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);
}
Respondida el 03/08/2008 a las 05:05
fuente por usuario tags2k


Aquí podría ser tu PUBLICIDAD


votos
13

Sería cauteloso de corregir automáticamente todas las palabras precedidas de 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 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.

Respondida el 03/08/2008 a las 08:10
fuente por usuario Ishmaeel

votos
10

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

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

Aquí hay una solución Ruby one-liner: http://snippets.dzone.com/posts/show/4702

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

Lo que hace el one-liner es usar una sustitución de expresión regular del primer carácter de cada palabra con la versión en mayúscula del mismo.

Respondida el 03/08/2008 a las 07:22
fuente por usuario engtech

votos
8

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 .

Respondida el 04/08/2008 a las 10:16
fuente por usuario Bill

votos
6

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);
}
Respondida el 02/03/2016 a las 07:32
fuente por usuario riteshakya037

votos
6

En Silverlight allí no está ToTitleCaseen la TextInfoclase.

He aquí una forma sencilla basada en expresiones regulares.

Nota: Silverlight no tiene expresiones regulares precompilados, 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();
        });
    }
Respondida el 09/06/2010 a las 05:24
fuente por usuario Simon_Weaver

votos
5

En Perl:

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

Eso es incluso en las preguntas frecuentes.

Respondida el 29/09/2008 a las 11:35
fuente por usuario Randal Schwartz

votos
5

Si el idioma que está utilizando tiene un método / función admitida, simplemente use eso (como en el ToTitleCasemétodo C # )

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)

Respondida el 03/08/2008 a las 05:33
fuente por usuario Lehane

votos
5

¿En que idioma?

En PHP es:

ucwords ()

ejemplo:

$HelloWorld = ucwords('hello world');
Respondida el 03/08/2008 a las 05:12
fuente por usuario cmcculloh

votos
4

ADECUADO 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;
}
Respondida el 02/03/2011 a las 11:29
fuente por usuario rumbu

votos
2

http://titlecase.com/tiene una API

Respondida el 09/06/2010 a las 05:09
fuente por usuario Simon_Weaver

votos
1

Aquí está un ejemplo sencillo de cómo hacerlo:

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}
Respondida el 15/12/2017 a las 08:54
fuente por usuario Simony

votos
1

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

Y un puerto de esta aplicación que simplemente he hecho en C ++: http://codepad.org/RrfcsZzO

Respondida el 19/11/2012 a las 08:59
fuente por usuario goji

votos
1

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

Era bastante contento de ver que no tenía que escribirlo yo mismo!

Respondida el 09/06/2010 a las 05:07
fuente por usuario Simon_Weaver

votos
1

Creo que el uso de la CultureInfo no siempre es fiable, este el camino simple y práctico de manipular manualmente la cadena:

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;
Respondida el 07/12/2009 a las 05:56
fuente por usuario user226515

votos
-1

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;
}
Respondida el 30/09/2008 a las 12:27
fuente por usuario TheOm3ga

votos
-1

Con Perl puedes hacer esto:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Respondida el 16/09/2008 a las 12:11
fuente por usuario robbiebow

votos
-1

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, '+').

Respondida el 03/08/2008 a las 05:25
fuente por usuario Rudd Zwolinski


Aquí podría ser tu PUBLICIDAD