2010-09-16 13 views
96

El método upcase pone en mayúscula toda la cadena.Poner en mayúscula la primera letra en ruby ​​

Necesito poner en mayúscula solo la primera letra.

Además, tengo que admitir varios idiomas populares, como el alemán y el ruso.

¿Cómo lo hago?

+3

Tenga en cuenta que algunos idiomas tienen diferentes ideas sobre cuál es la primera letra que se capitalizará. En irlandés, haces cosas como "i mBaile Átha Cliath" ("en Dublín") - minúscula 'm', mayúscula 'B'. (Consulte http://en.wikipedia.org/wiki/Consonant_mutation#Celtic_languages ​​si tiene curiosidad acerca de por qué irlandés haría eso y por qué tiene sentido.) –

+2

Y también tenga en cuenta que #capitalize descifrará todas las letras que no son t la primera letra ... que no es siempre lo que quieres. '['espacio', 'OVNI', 'NASA']. recoger {| w | w.capitalize} # => ['Space', 'Ufo', 'Nasa'] ' – Huliax

Respuesta

199

Depende de la versión de Ruby que utiliza.

de Ruby 2.4 y superior

Simplemente funciona, como ya this version rubí admite la asignación caso Unicode.

"мария".capitalize #=> Мария 

Rubí 2,3 e inferior

"maria".capitalize #=> "Maria" 
"мария".capitalize #=> мария 

El problema es, simplemente no hace lo que quiere: emite мария en lugar de Мария.

Si está utilizando rieles hay una solución fácil:

"мария".mb_chars.capitalize.to_s # requires ActiveSupport::Multibyte 

hace el trabajo.

De lo contrario, usted tiene que instalar la gema unicode y utilizar de esta manera:

require 'unicode' 

Unicode::capitalize("мария") #=> Мария 

Rubí 1,8

En primer lugar, asegúrese de usar la codificación de comentario mágica :

#!/usr/bin/env ruby 

puts "мария".capitalize 

da invalid multibyte char (US-ASCII), mientras que:

#!/usr/bin/env ruby 
#coding: utf-8 

puts "мария".capitalize 

obras sin errores, sino también ver Rubí 2,3 e inferior sección de verdad capitalizar.

+1

¡Funciona! Muchas gracias ! – AntonAL

+0

ha iniciado sesión solo para votar por usted. buen material. –

+8

Tenga en cuenta que aparentemente '" mi API es excelente ".capitalize' producirá' My api is great', que probablemente sea un comportamiento no deseado. Así que esta respuesta realmente no responde la pregunta, ya que solo quiere que la PRIMERA letra se pase a mayúsculas y otras que no se toquen. –

1

Use capitalize. Del docs:

Devuelve una copia de str con el primer carácter convertido a mayúscula y el resto a minúscula.

 "hello".capitalize #=> "Hello" 
     "HELLO".capitalize #=> "Hello" 
     "123ABC".capitalize #=> "123abc" 
+0

Utilice solo el signo de exclamación si desea cambiar la cadena original. – Magnar

+0

* doh * Gracias, corrigió mi error. – jhwist

+5

-1. El OP * explícitamente * menciona texto en alemán y ruso, lo que implica caracteres no ASCII. 'String # upcase' (y también' String # downcase') solo están definidos para caracteres ASCII. –

18

Desafortunadamente, es imposible que una máquina pueda subir/bajar/capitalizar correctamente. Necesita demasiada información contextual para que una computadora lo entienda.

Por eso la clase de Ruby String sólo es compatible con la capitalización de caracteres ASCII, ya que es al menos un poco bien definido.

¿Qué quiero decir con "información contextual"?

Por ejemplo, para capitalizar i correctamente, es necesario saber en qué idioma del texto está en Inglés, por ejemplo, tiene sólo dos i s:. I de capital sin un punto y pequeña i con un punto. Pero el turco tiene cuatro i s: capital I sin un punto, capital İ con un punto, pequeño ı sin un punto, pequeño i con un punto. Entonces, en inglés 'i'.upcase # => 'I' y en turco 'i'.upcase # => 'İ'. En otras palabras: dado que 'i'.upcase puede devolver dos resultados diferentes, dependiendo del idioma, obviamente es imposible capitalizar correctamente una palabra sin conocer su idioma.

Pero Ruby no conoce el idioma, solo conoce la codificación. Por lo tanto, es imposible capitalizar correctamente una cadena con la funcionalidad incorporada de Ruby.

Se pone peor: incluso con conociendo el idioma, a veces es imposible hacer las mayúsculas correctamente. Por ejemplo, en alemán, 'Maße'.upcase # => 'MASSE' (Maße es el plural de Maß que significa medida). Sin embargo, 'Masse'.upcase # => 'MASSE' (que significa masa). Entonces, ¿qué es 'MASSE'.capitalize? En otras palabras: para capitalizar correctamente se requiere una Inteligencia Artificial en toda regla.

Así, en lugar de dando a veces la respuesta equivocada, Ruby elige dar a veces no hay respuesta en absoluto , por lo que los caracteres no ASCII simplemente ignorados en downcase/upcase/capitalizar las operaciones. (Que por supuesto también lee a resultados erróneos, pero al menos es fácil de comprobar.)

+4

Lo siento, pero su argumentación no se sostiene. No es cierto que Ruby decida no dar una respuesta en absoluto, Ruby siempre da una respuesta, lo que a menudo es incorrecto, por ej. "мария" .case nunca debe devolver "мария", eso no es correcto en ningún contexto. Y sus digresiones acerca de la necesidad de AI no son relevantes en absoluto; no hay nada que evite que se restaure una matriz, digamos ['I', 'İ'] para 'i' .case, y dejar que la persona que llama decida qué capitalización es relevante en una situación dada. Actualmente, el manejo de Ruby de la conversión entre mayúsculas y minúsculas está roto, y eso es todo. – michau

+2

-1 porque hay un capital [Eszett] (https://en.wikipedia.org/wiki/Capital_%E1%BA%9E). El uso de un área no completamente formalizada no puede servir como prueba de que esa solución es posible solo con AI. – Mike

38

mayúscula la primera letra de la primera palabra de la cadena de

"kirk douglas".capitalize 
#=> "Kirk douglas" 

en mayúscula la primera letra de cada palabra

En raíles:

"kirk douglas".titleize 
=> "Kirk Douglas" 

O

"kirk_douglas".titleize 
=> "Kirk Douglas"  

En Ruby:

"kirk douglas".split(/ |\_|\-/).map(&:capitalize).join(" ") 
#=> "Kirk Douglas" 

fuera de los carriles, pero todavía querer usar el método titleize

require 'active_support/core_ext' 
"kirk douglas".titleize #or capitalize 
+2

Tenga en cuenta que 'capitalize' solo funcionará con caracteres ASCII. – infused

+1

Upvote para una solución pura de Ruby. Demasiado perezoso para encender Rails propiamente dicho, y esto funcionó :) – illbzo1

12

Bueno, por lo que sólo saben cómo capitalizar sólo la primera letra y deje el resto de ellos solo (porque a veces eso es lo que se desea) ...

['NASA', 'MHz', 'sputnik'].collect do |word| 
    letters = word.split('') 
    letters.first.upcase! 
    letters.join 
end 

=> ["NASA", "MHz", "Sputnik"] 

Calling #capitalize daría lugar a ["Nasa", "Mhz", "Sputnik"]

+0

Gracias justo lo que estaba buscando, útil para convertir encabezados en 'sentencia caso' – lux

1

Puede utilizar mb_chars.Esto respeta Umlaute:

class String 

    # Only capitalize first letter of a string 
    def capitalize_first 
    self[0] = self[0].mb_chars.upcase 
    self 
    end 

end 

Ejemplo:

"ümlaute".capitalize_first 
#=> "Ümlaute" 
3

Como de apoyo activo y rieles 5.0.0.beta4 que puede utilizar uno de los dos métodos: String#upcase_first o ActiveSupport::Inflector#upcase_first. Compruebe esto blog post para más información.

Cuestiones relacionadas