char es un tipo de datos primitivo y no tiene métodos. Por esta razón, la clase Character en el paquete principal java.lang incluye una gran cantidad de métodos que son útiles para tratar con caracteres individuales; Muchos de estos métodos son estáticos. Esta clase incluye métodos para probar, como por ejemplo si un carácter es un dígito, una letra o un carácter especial.
Lo que todos los métodos de prueba tienen en común es que comienzan con el prefijo is y devuelven un valor booleano. Además, hay métodos disponibles para convertir, por ejemplo, a mayúsculas o minúsculas. La siguiente lista incluye algunos ejemplos:
Todos estos métodos «conocen» las propiedades de cada carácter Unicode. Además, el punto de código de cada carácter Unicode es siempre el mismo, independientemente de si el programa se ejecuta en Alemania o Mongolia.
Nota: El término «letra» no solo describe letras conocidas como «a» o «?». Unicode contiene más de 100.000 caracteres, incluidos cientos de letras y números.5
En el siguiente ejemplo, declararemos un método que se ejecutará a través de una cadena y probaremos si la cadena consta solo de dígitos. Aunque esta funcionalidad es útil en la práctica, Java Platform, Standard Edition (Java SE) no proporciona un método sencillo para ello.
public class IsNumeric {
/**
* Returns {@code true} if the String contains only Unicode digits.
* An empty string or {@code null} leads to {@code false}.
*
* @param string Input String.
* @return {@code true} if string is numeric, {@code false} otherwise.
*/
public static boolean isNumeric( String string ) {
if ( string == null || string.length() == 0 )
return false;
for ( int i = 0; i < string.length(); i++ )
if ( ! Character.isDigit( string.charAt( i ) ) )
return false;
return true;
}
public static void main( String[] args ) {
System.out.println( isNumeric( "1234" ) ); // true
System.out.println( isNumeric( "12.4" ) ); // false
System.out.println( isNumeric( "-123" ) ); // false
}
}
Nuestro método define que una cadena nula y vacía no se considera numérica. También puede especificar que null debería generar una excepción y que una cadena vacía sea definitivamente numérica. Convenciones como estas dependen del autor de la biblioteca, y diferentes bibliotecas de utilidades con funciones auxiliares tienen diferentes usos.
Nuestro ejemplo utiliza dos métodos String: length() devuelve la longitud de una cadena y charAt(int) devuelve el carácter en la posición deseada. Un bucle itera sobre la cadena y prueba cada carácter con isDigit(…). Si un carácter no es un dígito, return false sale automáticamente del bucle. Si el bucle se ejecuta correctamente, un retorno verdadero puede informar que cada carácter era un dígito.
clase final java.lang.Personaje
implementa Serializable, Comparable
¿Es un dígito entre 0 y 9?
¿Es una carta?
¿Es un carácter alfanumérico?
¿Es una letra minúscula o una letra mayúscula?
¿Es un espacio, un salto de línea, un retorno o una tabulación (es decir, espacio en blanco)?
Para convertir un carácter a mayúsculas/minúsculas, la clase Character declara los métodos toUpperCase(…) y toLowerCase(…). Los métodos is*(…) que llevan a cabo las pruebas se utilizan a menudo cuando se atraviesa una cadena.
Nuestro siguiente ejemplo le pide al usuario que ingrese una cadena. Las letras válidas deben convertirse a mayúsculas y cualquier espacio en blanco debe reemplazarse con un guión bajo. Para ejecutar la entrada, usaremos nuevamente los métodos String length() y charAt(int).
String input = new java.util.Scanner( System.in ).nextLine();
for ( int i = 0; i < input.length(); i++ ) {
char c = input.charAt( i );
if ( Character.isWhitespace( c ) )
System.out.print( '_' );
else if ( Character.isLetter( c ) )
System.out.print( Character.toUpperCase( c ) );
}
Por ejemplo, para la entrada «honiara brotherhood guesthouse1», el resultado es «HONIARA_ BROTHERHOOD_GUESTHOUSE». El “1” desaparece porque no es ni un espacio en blanco ni una letra.
final class java.lang.Character
implements Serializable, Comparable<Character>
Los métodos estáticos devuelven la letra mayúscula o minúscula correspondiente.
Nota: Los métodos toUpperCase(…) y toLowerCase(…) existen dos veces: una vez como métodos estáticos en Character (en cuyo caso, aceptan exactamente un carácter como argumento) y otra vez como métodos de objeto en objetos String. Se debe tener cuidado con Character.toUpperCase(‘s’) porque el resultado es “ß”, a diferencia del método String «s».toUpperCase(), devuelve el resultado “SS”, es decir, una cadena extendida en uno. Aunque ahora hay una “ß” mayúscula (Unicode U+00DF), Java todavía devuelve Unicode U+00DF, no U+1E9E, para Character.toUpperCase(‘s’).
Para convertir un carácter Unicode en una cadena, puede utilizar el método de cadena estático sobrecargado valueOf(char). También existe un método comparable en Character, a saber, el método estático toString(char). Ambos métodos están limitados porque el carácter Unicode puede tener sólo 2 bytes de longitud. El método estático Character.toString(int) crea una cadena para cualquier carácter Unicode y, por tanto, Character.toString(128123) da como resultado una cadena con un fantasma.
Cuando los caracteres provienen de una entrada del usuario, a menudo se le solicita que los convierta en números. El dígito ‘5’ se convertirá en el valor numérico 5. Según las antiguas tradiciones de los hackers, la solución siempre fue restar el valor ‘0’. El cero ASCII ‘0’ tiene el valor char 48, y ‘1’ luego tiene el valor 49, hasta que ‘9’ finalmente llega a 57. Lógicamente, ‘5’ – ‘0’ = 53 – 48 = 5. La solución tiene el desventaja de trabajar sólo con dígitos ASCII.
Por ejemplo, una buena solución Java es convertir un carácter en una cadena y luego convertirlo mediante un método Integer, por ejemplo, de la siguiente manera:
charc=»5″;
int i = Integer.parseInt( String.valueOf(c) ); // 5
El método parseInt(…) está completamente internacionalizado y también convierte números decimales de otras escrituras, como hindi/sánscrito:
System.out.println( Integer.parseInt( » » ) ); // 5
Este método funciona pero no es eficaz para caracteres individuales en bucles. Hay otras dos formas disponibles, utilizando métodos estáticos de la clase Character.
El método Character getNumericValue(char) devuelve el valor numérico de un dígito. Por supuesto, este método también se ha internacionalizado. Considere el siguiente ejemplo:
int i = Character.getNumericValue( '5' );
System.out.println( i ); // 5
System.out.println( Integer.parseInt( " " ) ); // 5
El método es mucho más potente porque conoce el “valor” real de todos los caracteres Unicode, incluidos, por ejemplo, también los números romanos (I, II, III, IV, V, VI, VII, VIII, IX, X, XI, XII, L, C, D y M), que se colocan en el alfabeto Unicode a partir de \u2160:
System.out.println( Character.getNumericValue( ‘\u216f’ ) ); // 1000
El método Integer.parseInt(…) no puede manejar \u216f, por lo que Integer.parseInt(«\ u216f») genera una excepción.
La clase Carácter también tiene métodos de conversión de dígitos con respecto a cualquier base, y viceversa.
clase final java.lang.Personaje
implementa Serializable, Comparable
Devuelve el valor numérico que tiene el carácter ch bajo la base; común es base 10. Por ejemplo, Character.digit(‘f’, 16) es igual a 15. Se permite cualquier sistema numérico con una base entre Character.MIN_RADIX (2) y Character.MAX_RADIX (36). Si no es posible realizar ninguna conversión, el valor de retorno es -1.
Convierte un valor numérico en un carácter. Por ejemplo, Character.forDigit(6, 8) es «6» y Character.forDigit(12, 16) es «c».
Ejemplo: El siguiente ejemplo convierte una cadena de dígitos en un número entero:
char[] chars = { '3', '4', '0' };
int result = 0;
for ( char c : chars ) {
result = result * 10 + Character.digit( c, 10 );
System.out.println( result );
}
The output is 3, 34, and 340.
Nota del editor: esta publicación ha sido adaptada de una sección del libro. Java: La guía completa Por Christian Ullenboom.
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073