java - capital - Conversión de cadena a mayúscula
title case a sentence (14)
¡Lo siento, soy un principiante, así que mi hábito de codificación es una mierda!
public class TitleCase {
String title(String sent)
{
sent =sent.trim();
sent = sent.toLowerCase();
String[] str1=new String[sent.length()];
for(int k=0;k<=str1.length-1;k++){
str1[k]=sent.charAt(k)+"";
}
for(int i=0;i<=sent.length()-1;i++){
if(i==0){
String s= sent.charAt(i)+"";
str1[i]=s.toUpperCase();
}
if(str1[i].equals(" ")){
String s= sent.charAt(i+1)+"";
str1[i+1]=s.toUpperCase();
}
System.out.print(str1[i]);
}
return "";
}
public static void main(String[] args) {
TitleCase a = new TitleCase();
System.out.println(a.title(" enter your Statement!"));
}
}
¿Hay algún método integrado disponible para convertir una cadena en formato de Título de Caso como tal?
Apache Commons StringUtils.capitalize() o WordUtils.capitalize()
Ejemplo: WordUtils.capitalize("i am FINE") = "I Am FINE"
WordUtils.capitalize() WordUtils.capitalize("i am FINE") = "I Am FINE"
del documento de WordUtils.capitalize()
Aquí hay otra toma basada en las respuestas de @dfa y @ scottb que maneja cualquier carácter que no sea de letras / dígitos:
public final class TitleCase {
public static String toTitleCase(String input) {
StringBuilder titleCase = new StringBuilder();
boolean nextTitleCase = true;
for (char c : input.toLowerCase().toCharArray()) {
if (!Character.isLetterOrDigit(c)) {
nextTitleCase = true;
} else if (nextTitleCase) {
c = Character.toTitleCase(c);
nextTitleCase = false;
}
titleCase.append(c);
}
return titleCase.toString();
}
}
Entrada dada:
MARY ÄNN O''CONNEŽ-ŠUSLIK
la salida es
Mary Änn O''Connež-Šuslik
Conversión a caso de título adecuado:
String s= "ThiS iS SomE Text";
String[] arr = s.split(" ");
s = "";
for (String s1 : arr) {
s += WordUtils.capitalize(s1.toLowerCase()) + " ";
}
s = s.substring(0, s.length() - 1);
Resultado: "This Is Some Text"
Esto es algo que escribí para convertir snake_case en lowerCamelCase, pero podría ajustarse fácilmente en función de los requisitos
private String convertToLowerCamel(String startingText)
{
String[] parts = startingText.split("_");
return parts[0].toLowerCase() + Arrays.stream(parts)
.skip(1)
.map(part -> part.substring(0, 1).toUpperCase() + part.substring(1).toLowerCase())
.collect(Collectors.joining());
}
La forma más sencilla de convertir cualquier cadena en un caso de título es usar el paquete googles org.apache.commons.lang.WordUtils
System.out.println(WordUtils.capitalizeFully("tHis will BE MY EXAMple"));
Conseguirá esto
Este será mi ejemplo
No estoy seguro de por qué se llama "capitalizeFully", donde de hecho la función no está haciendo un capital completo, pero de todos modos, esa es la herramienta que necesitamos.
Puede usar lenguajes de Apache commons como este:
WordUtils.capitalizeFully("this is a text to be capitalize")
puedes encontrar el documento de Java aquí: WordUtils.capitalizeFully java doc
y si quieres eliminar los espacios entre los mundos, puedes usar:
StringUtils.remove(WordUtils.capitalizeFully("this is a text to be capitalize")," ")
puede encontrar el documento de Java para String StringUtils.remove java doc
espero esta ayuda
Recientemente me encontré con este problema y desafortunadamente tuve muchas ocurrencias de nombres que comenzaban con Mc y Mac, terminé usando una versión del código de scottb que cambié para manejar estos prefijos así que está aquí en caso de que alguien quiera usarlo.
Todavía hay casos límite que se pierde, pero lo peor que puede pasar es que una letra será minúscula cuando se debe escribir en mayúscula.
/**
* Get a nicely formatted representation of the name.
* Don''t send this the whole name at once, instead send it the components.<br>
* For example: andrew macnamara would be returned as:<br>
* Andrew Macnamara if processed as a single string<br>
* Andrew MacNamara if processed as 2 strings.
* @param name
* @return correctly formatted name
*/
public static String getNameTitleCase (String name) {
final String ACTIONABLE_DELIMITERS = " ''-/";
StringBuilder sb = new StringBuilder();
if (name !=null && !name.isEmpty()){
boolean capitaliseNext = true;
for (char c : name.toCharArray()) {
c = (capitaliseNext)?Character.toUpperCase(c):Character.toLowerCase(c);
sb.append(c);
capitaliseNext = (ACTIONABLE_DELIMITERS.indexOf((int) c) >= 0);
}
name = sb.toString();
if (name.startsWith("Mc") && name.length() > 2 ) {
char c = name.charAt(2);
if (ACTIONABLE_DELIMITERS.indexOf((int) c) < 0) {
sb = new StringBuilder();
sb.append (name.substring(0,2));
sb.append (name.substring(2,3).toUpperCase());
sb.append (name.substring(3));
name=sb.toString();
}
} else if (name.startsWith("Mac") && name.length() > 3) {
char c = name.charAt(3);
if (ACTIONABLE_DELIMITERS.indexOf((int) c) < 0) {
sb = new StringBuilder();
sb.append (name.substring(0,3));
sb.append (name.substring(3,4).toUpperCase());
sb.append (name.substring(4));
name=sb.toString();
}
}
}
return name;
}
Sé que este es más antiguo, pero no tiene la respuesta simple, necesitaba este método para mi codificación, así que agregué aquí, fácil de usar.
public static String toTitleCase(String input) {
input = input.toLowerCase();
char c = input.charAt(0);
String s = new String("" + c);
String f = s.toUpperCase();
return f + input.substring(1);
}
Si desea la respuesta correcta de acuerdo con el último estándar Unicode, debe usar icu4j.
UCharacter.toTitleCase(Locale.US, "hello world", null, 0);
Tenga en cuenta que esto es sensible a la configuración regional.
Si puedo enviar mi opinión sobre la solución ...
El siguiente método se basa en el que dfa publicó. Hace el siguiente cambio principal (que se adapta a la solución que necesitaba en ese momento): fuerza a todos los caracteres de la cadena de entrada a minúsculas a menos que esté precedido inmediatamente por un "delimitador accionable" en cuyo caso el personaje es forzado a mayúscula
Una limitación importante de mi rutina es suponer que el "caso del título" está uniformemente definido para todas las configuraciones regionales y está representado por las mismas convenciones de casos que he usado, por lo que es menos útil que el código de dfa al respecto.
public static String toDisplayCase(String s) {
final String ACTIONABLE_DELIMITERS = " ''-/"; // these cause the character following
// to be capitalized
StringBuilder sb = new StringBuilder();
boolean capNext = true;
for (char c : s.toCharArray()) {
c = (capNext)
? Character.toUpperCase(c)
: Character.toLowerCase(c);
sb.append(c);
capNext = (ACTIONABLE_DELIMITERS.indexOf((int) c) >= 0); // explicit cast not needed
}
return sb.toString();
}
VALORES DE PRUEBA
una cuerda
maRTin o''maLLEY
john wilkes-stand
AÚN OTRA CADENA
SALIDAS
Una cuerda
Martin O''Malley
John Wilkes-Booth
Sin embargo, otra cadena
Use WordUtils.capitalizeFully() de Apache Commons.
WordUtils.capitalizeFully(null) = null
WordUtils.capitalizeFully("") = ""
WordUtils.capitalizeFully("i am FINE") = "I Am Fine"
no hay métodos capitalize () o titleCase () en la clase String. Tienes dos opciones:
- usando commons lang string utils .
StringUtils.capitalize(null) = null
StringUtils.capitalize("") = ""
StringUtils.capitalize("cat") = "Cat"
StringUtils.capitalize("cAt") = "CAt"
StringUtils.capitalize("''cat''") = "''cat''"
- escribir (otro más) método de ayuda estático toTitleCase ()
Implementación de muestra
public static String toTitleCase(String input) {
StringBuilder titleCase = new StringBuilder();
boolean nextTitleCase = true;
for (char c : input.toCharArray()) {
if (Character.isSpaceChar(c)) {
nextTitleCase = true;
} else if (nextTitleCase) {
c = Character.toTitleCase(c);
nextTitleCase = false;
}
titleCase.append(c);
}
return titleCase.toString();
}
Caso de prueba
System.out.println(toTitleCase("string"));
System.out.println(toTitleCase("another string"));
System.out.println(toTitleCase("YET ANOTHER STRING"));
productos:
String Another String YET ANOTHER STRING
puedes usar muy bien
org.apache.commons.lang.WordUtils
o
CaseFormat
de la API de Google.