1

Descripción:

Tengo valores de tipo double (ej. 1.0, 1.5, 2.0, etc.) los cuales me gustaría dividirlos en dos partes. Por un lado me gustaría tener el número antes de el punto (.) (la unidad) y por el otro lado me gustaría separar el decimal (el número después del punto).

Adjunto el código JAVA de lo que estoy intentando hacer

    1 double duracion_horas = 1.5; //Esto sería una hora y media
    2 String Sduracion_horas = String.valueOf(duracion_horas);
    3 String separador_total[] = Sduracion_horas.split(".");
    4
    5 Toast.makeText(context, separador_total_clase[1], Toast.LENGTH_SHORT).show();

Al ejecutar este código, obtengo un error el cual apunta a la línea número 5:

java.lang.ArrayIndexOutOfBoundsException: length=0; index=1

Pregunta:

A que se puede deber este error? Nunca antes había tenido problemas con el uso de split.

Espero poder solucionar este problema lo más pronto posible. Gracias por leer!!

Tomas M
  • 785
  • 5
  • 15

2 Answers2

2

Existen caracteres para "uso especial" llamados metacaracteres,

Los metacaracteres son caracteres no alfabéticos que poseen un significado especial en las expresiones regulares. que son :

\ , ^ , $ , . , | , ? , * , + , ( , ) , { , } , [

(de esta lista el único que funcionaría sin problema es }).

Si estos son usados directamente para separar una cadena no funcionaran adecuadamente, ejemplo:

String cadena = "Hola|Stackoverflow|en|español";
String[] parts = cadena.split("|");              
System.out.println(Arrays.asList(parts));

Salida incorrecta:

[H, o, l, a, |, S, t, a, c, k, o, v, e, r, f, l, o, w, |, e, n, |, e, s, p, a, ñ, o, l]

estos caracteres deben ser escapados antecediendo el caracter "\", ejemplo:

String cadena = "Hola|Stackoverflow|en|español";
String[] parts = cadena.split("\\|");              
System.out.println(Arrays.asList(parts));

Salida correcta:

[Hola, Stackoverflow, en, español]

Lo mismo en el caso que expones usando ".":

   String cadena = "Hola.Stackoverflow.en.español";
   String[] parts = cadena.split(".");              
   System.out.println(Arrays.asList(parts));

Salida incorrecta:

[]

Debes definir el separador escapado de esta forma \\.:

   String cadena = "Hola.Stackoverflow.en.español";
   String[] parts = cadena.split("\\.");              
   System.out.println(Arrays.asList(parts));

Salida correcta:

[Hola, Stackoverflow, en, español]

Te sugiero usar el método indicado en la respuesta ¿Tienes problemas al usar un carácter como separador?

private static String[] separaCaracteres(String cadena, String separator){        
    System.out.println("Separator: " + separator);
    String[] parts = null;   
    if(separator.equals("|")|| separator.equals("\\")||separator.equals(".")||separator.equals("^")||separator.equals("$")
            ||separator.equals("?")||separator.equals("*")||separator.equals("+")||separator.equals("(")||separator.equals(")")
            ||separator.equals("{")||separator.equals("[")){
        //Es metacaracter!
        parts = cadena.split("\\"+separator);       
    }else{
        //No es metacaracter.
        parts = cadena.split(separator);
    }    
    return parts;
}

y lo puedes llamar de esta forma:

String separador_total[] = separaCaracteres(Sduracion_horas, ".");

ejemplo:

double duracion_horas = 1.5; //Esto sería una hora y media
String Sduracion_horas = String.valueOf(duracion_horas);
String separador_total[] = separaCaracteres(Sduracion_horas , ".");

//Imprime array
 System.out.println(Arrays.asList(separador_total));

tendrías como salida un array con los elementos deseados:

[1, 5]
Jorgesys
  • 103,630
  • 13
  • 52
  • 124
  • 1
    Muchas gracias una vez más. Tus respuestas son las mejores, aunque ya tuve solución. Pero te agradezco por darme más conocimiento el cual no tenía. Es increíble el aporte que haces a la comunidad. Gracias infinitas! – Tomas M Feb 15 '20 at 16:03
  • Hola Tomas, de eso se trata la comunidad de aportar información que sea de ayuda todos, saludos! – Jorgesys Feb 15 '20 at 18:49
1

El problema que tenés es que split lleva un regex como argumento.

En un regex el punto significa cualquier caracter, por lo tanto ni idea de lo que puede tratar de estar tomando para hacer el split.

Para que en un regex el punto sea literalmente un punto hay que escaparlo con \.

Ahora en java \ también es el caracter de escape en un String y por lo tanto también hay que escaparlo.

En resumen la instrucción te quedaría como:

String separador_total[] = Sduracion_horas.split("\\.");
Juan
  • 5,605
  • 1
  • 9
  • 15
  • 1
    Aquí la documentación por si alguien desea echarle un ojo: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String – fredyfx Feb 14 '20 at 00:03
  • @Juan Muchisimas gracias. Me funcionó tu código! – Tomas M Feb 14 '20 at 00:40