Created
October 28, 2018 23:07
-
-
Save Reflej0/ee925982c9079f4cffa8bc6f65b5787b to your computer and use it in GitHub Desktop.
Ejercicio Duración legible por humanos, dado x cantidad de segundos descomponen en anos, días, horas, minutos y segundos.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class FormatoAmigable | |
{ | |
/** Limites https://cs.fit.edu/~ryan/java/language/java-data.html | |
* Calculadora https://www.dcode.fr/big-numbers-division | |
* MAX_INT = 2147483647 | |
* MAX_LONG = 9223372036854775807 | |
* Segundos en un ano = 31536000 | |
* Cantidad max anos (int) 68 | |
* Cantidad max anos (long) 292471208677 | |
*/ | |
public static String duracion(long numero) | |
{ | |
if(numero < 0) | |
return "Entrada invalida"; | |
else if(numero == 0) | |
return "Ahora"; | |
String retorno = ""; | |
long anos = numero / 31536000; | |
if(anos>0) | |
numero -= (anos * 31536000); | |
long dias = numero / 86400; | |
if(dias>0) | |
numero -= (dias * 86400); | |
long horas = numero / 3600; | |
if(horas>0) | |
numero -= (horas * 3600); | |
long minutos = numero / 60; | |
if(minutos>0) | |
numero -= (minutos * 60); | |
long segundos = numero; | |
if(anos==1) | |
retorno+="1 ano,"; | |
else if(anos>1) | |
retorno+=anos+" anos, "; | |
if(dias==1) | |
retorno+=" 1 dia, "; | |
else if(dias>1) | |
retorno+=dias+" dias, "; | |
if(horas==1) | |
retorno+=" 1 hora, "; | |
else if(horas>1) | |
retorno+=horas+" horas, "; | |
if(minutos==1) | |
retorno+=" 1 minuto,"; | |
else if(minutos>1) | |
retorno+=minutos+" minutos,"; | |
if(segundos==1) | |
retorno+=" 1 segundo"; | |
else if(segundos>1) | |
retorno+=segundos+" segundos"; | |
//Tratamiento de la cadena antes de ser retornada. | |
//1) Elimino los espacios de adelante y atras, si es que hubiese. | |
retorno = retorno.trim(); | |
//2) Elimino la ultima coma si es que hubiese. | |
int longitud = retorno.length()-1; | |
if(retorno.charAt(longitud)==',') | |
retorno = retorno.substring(0, longitud); | |
//3)Detecto la ultima , y la reemplazo por y. | |
int ultimaComa = retorno.lastIndexOf(','); | |
if(ultimaComa!=-1) | |
{ | |
String primero = retorno.substring(0, ultimaComa); | |
String segundo = ""; | |
//5)Detectado a base de pruebas tambien. No parece ser una solucion muy elegante jaja. | |
try | |
{ | |
segundo = retorno.substring(ultimaComa+1, longitud+1); | |
} | |
catch(StringIndexOutOfBoundsException e) | |
{ | |
segundo = retorno.substring(ultimaComa+1, longitud); | |
} | |
retorno=primero+" y "+segundo; | |
} | |
//4)Detectado a base de pruebas. En algunos casos cuando se realiza el punto 3. | |
//Remueve mas de dos espacios seguidos. | |
retorno = retorno.replaceAll("\\s{2,}", " "); | |
return retorno; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.junit.Assert; | |
import org.junit.jupiter.api.Test; | |
public class Tests | |
{ | |
@Test | |
public void numeroNegativo() | |
{ | |
String retorno = FormatoAmigable.duracion(-1); | |
Assert.assertEquals(retorno, "Entrada invalida"); | |
} | |
@Test | |
public void ahora() | |
{ | |
String retorno = FormatoAmigable.duracion(0); | |
Assert.assertEquals(retorno, "Ahora"); | |
} | |
@Test | |
public void unSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(1); | |
Assert.assertEquals(retorno, "1 segundo"); | |
} | |
@Test | |
public void unMinuto() | |
{ | |
String retorno = FormatoAmigable.duracion(60); | |
Assert.assertEquals(retorno, "1 minuto"); | |
} | |
@Test | |
public void unMinutounSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(61); | |
Assert.assertEquals(retorno, "1 minuto y 1 segundo"); | |
} | |
@Test | |
public void unMinutodosSegundos() | |
{ | |
String retorno = FormatoAmigable.duracion(62); | |
Assert.assertEquals(retorno, "1 minuto y 2 segundos"); | |
} | |
@Test | |
public void dosMinutos() | |
{ | |
String retorno = FormatoAmigable.duracion(120); | |
Assert.assertEquals(retorno, "2 minutos"); | |
} | |
@Test | |
public void dosMinutosunSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(121); | |
Assert.assertEquals(retorno, "2 minutos y 1 segundo"); | |
} | |
@Test | |
public void dosMinutostresSegundos() | |
{ | |
String retorno = FormatoAmigable.duracion(123); | |
Assert.assertEquals(retorno, "2 minutos y 3 segundos"); | |
} | |
@Test | |
public void unaHora() | |
{ | |
String retorno = FormatoAmigable.duracion(3600); | |
Assert.assertEquals(retorno, "1 hora"); | |
} | |
@Test | |
public void unaHoraunSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(3601); | |
Assert.assertEquals(retorno, "1 hora y 1 segundo"); | |
} | |
@Test | |
public void unaHoraunMinuto() | |
{ | |
String retorno = FormatoAmigable.duracion(3660); | |
Assert.assertEquals(retorno, "1 hora y 1 minuto"); | |
} | |
@Test | |
public void unaHoraunMinutounSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(3661); | |
Assert.assertEquals(retorno, "1 hora, 1 minuto y 1 segundo"); | |
} | |
@Test | |
public void unaHoraunMinutodosSegundos() | |
{ | |
String retorno = FormatoAmigable.duracion(3662); | |
Assert.assertEquals(retorno, "1 hora, 1 minuto y 2 segundos"); | |
} | |
@Test | |
public void unaHoradosMinutos() | |
{ | |
String retorno = FormatoAmigable.duracion(3720); | |
Assert.assertEquals(retorno, "1 hora y 2 minutos"); | |
} | |
@Test | |
public void unaHoradosMinutosunSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(3721); | |
Assert.assertEquals(retorno, "1 hora, 2 minutos y 1 segundo"); | |
} | |
@Test | |
public void unaHoradosMinutostresSegundos() | |
{ | |
String retorno = FormatoAmigable.duracion(3723); | |
Assert.assertEquals(retorno, "1 hora, 2 minutos y 3 segundos"); | |
} | |
@Test | |
public void dosHoras() | |
{ | |
String retorno = FormatoAmigable.duracion(7200); | |
Assert.assertEquals(retorno, "2 horas"); | |
} | |
public void dosHoras59Segundos() | |
{ | |
String retorno = FormatoAmigable.duracion(7259); | |
Assert.assertEquals(retorno, "2 horas y 59 segundos"); | |
} | |
@Test | |
public void dosHorascuarentaMinutos() | |
{ | |
String retorno = FormatoAmigable.duracion(9600); | |
Assert.assertEquals(retorno, "2 horas y 40 minutos"); | |
} | |
@Test | |
public void dosHorascuarentaMinutosonceSegundos() | |
{ | |
String retorno = FormatoAmigable.duracion(9611); | |
Assert.assertEquals(retorno, "2 horas, 40 minutos y 11 segundos"); | |
} | |
@Test | |
public void unDia() | |
{ | |
String retorno = FormatoAmigable.duracion(86400); | |
Assert.assertEquals(retorno, "1 dia"); | |
} | |
@Test | |
public void unDiaunSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(86401); | |
Assert.assertEquals(retorno, "1 dia y 1 segundo"); | |
} | |
@Test | |
public void unDia48Segundos() | |
{ | |
String retorno = FormatoAmigable.duracion(86448); | |
Assert.assertEquals(retorno, "1 dia y 48 segundos"); | |
} | |
@Test | |
public void unDiaUnHoraTresMinutos59segundos() | |
{ | |
String retorno = FormatoAmigable.duracion(90239); | |
Assert.assertEquals(retorno, "1 dia, 1 hora, 3 minutos y 59 segundos"); | |
} | |
@Test | |
//1 segundo menos para un ano. | |
public void trescientossesentaycuatrodias23horas59minutos59segundos() | |
{ | |
String retorno = FormatoAmigable.duracion(31535999); | |
Assert.assertEquals(retorno, "364 dias, 23 horas, 59 minutos y 59 segundos"); | |
} | |
@Test | |
public void unAno() | |
{ | |
String retorno = FormatoAmigable.duracion(31536000); | |
Assert.assertEquals(retorno, "1 ano"); | |
} | |
@Test | |
public void unAnoUnSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(31536001); | |
Assert.assertEquals(retorno, "1 ano y 1 segundo"); | |
} | |
@Test | |
public void unAnoUnDia53MinutosUnSegundo() | |
{ | |
String retorno = FormatoAmigable.duracion(31625581); | |
Assert.assertEquals(retorno, "1 ano, 1 dia, 53 minutos y 1 segundo"); | |
} | |
@Test | |
public void nueveAnosDosDias() | |
{ | |
String retorno = FormatoAmigable.duracion(283824000+172800); | |
Assert.assertEquals(retorno, "9 anos y 2 dias"); | |
} | |
@Test | |
public void FatigaDeVariable() | |
{ | |
String retorno = FormatoAmigable.duracion(9223372036854775807L); | |
Assert.assertEquals(retorno, "292471208677 anos, 195 dias, 15 horas, 30 minutos y 7 segundos"); | |
} | |
@Test | |
public void CasiUnDia() | |
{ | |
String retorno = FormatoAmigable.duracion(86399); | |
Assert.assertEquals(retorno, "23 horas, 59 minutos y 59 segundos"); | |
} | |
public void SobrePasoFatigaVariable() | |
{ | |
//No me deja escribir el numero directamente. | |
//String retorno = FormatoAmigable.duracion(9223372036854775808L); | |
//System.out.println(retorno); | |
//Assert.assertEquals(retorno, "292471208677 anos, 195 dias, 15 horas, 30 minutos y 7 segundos"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment