[Batch] Función año bisiesto de 3 líneas.

Iniciado por 0x0309, 5 Mayo 2009, 04:02 AM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

La otra vez había hecho una función para saber si un año es bisiesto o no, y tenía muchas líneas. Ahora la he escrito en menos.


@echo off

call :esBisiesto 2008
echo.2008 : bisiesto : %errorlevel%
call :esBisiesto 2000
echo.2000 : bisiesto : %errorlevel%
call :esBisiesto 1900
echo.1999 : bisiesto : %errorlevel%
pause
goto :eof

:esBisiesto
::Funcion para saber si un anyo es bisiesto o no
::Autor: Carlos
::Devuelve 1 si es bisiesto y 0 si no lo es.
::Recibe un argumento con el anyo.
::Ejemplo: call :esBisiesto 2008
::Ejemplo: call :esBisiesto 2000
::Ejemplo: call :esBisiesto 1900
::Para ver el retorno deben expandir errorlevel
@setlocal enableextensions disabledelayedexpansion
@set /a b="(!(%~1%%4)&!!(%~1%%100))|!(%~1%%400)"
@exit /b %b%


leogtz

Excelente 0x0309, aun no sabia como usar los ! en el SET /a.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

M a t t

#2
Supongo que también funcionaría:

:esBisiesto
setlocal enableextensions
set /a "etc=%~1/4*4"
if "%~1" equ "%etc%" (exit /b 1) else (exit /b 0)

0x0309

Cita de: M a t t en  5 Mayo 2009, 07:24 AM
Supongo que también funcionaría:

:esBisiesto
setlocal enableextensions
set /a "etc=%~1/4*4"
if "%~1" equ "%etc%" (exit /b 1) else (exit /b 0)


Nada que ver, el algoritmo de año bisiesto no dice solamente que sea divisible por 4, por ejemplo: 1900 no es año bisiesto, ya que es divisible por 100 pero no por 400.

M a t t

#4
Ahh, yo pensaba que un año es bisiesto si es divisible por 4 y nada más.

Excelente código.

0x0309

He actualizado el código levemente, he añadido la palabra disabledelayedexpasion, ya que cuando se llamaba a la función con la expansión retardada activada se producía un error que decía: Sobran o faltan paréntesis.
Cuando se hacía esto:

setlocal enabledelayedexpansion
call :esBisiesto 2009
rem se producía el error.
rem ahora ha sido corregido.