[SOLUCIONADO][BATCH]Funcion Valida Rut

Iniciado por FranciskoAsdf, 19 Septiembre 2009, 18:07 PM

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

FranciskoAsdf

Hola a Todos, espero me puedan ayudar en esta ocacion T_T...
Estoy haciendo un programita, en donde cada persona debe entrar con su RUT (Registro Único Tributario.CHILE), pero necesito verificar si el RUT de la persona esta bien escrito o es real,  para eso existe una funcion llamada "Funcion Valida Rut", a mi me la pasaron en Vb6.0, no es muy complicada, pero parece que en batch si xD...

Explico un poko como se valida un RUT...

Por ejemplo tengo los 8 primeros digitos del RUT 11.222.333-?, lo que hace la funcion es extraer desde atras para adelante los 8 primeros digitos y multiplicarlos por numeros específicos por ejemplo:



    1   1   2   2   2   3   3   3  
  * 3   2   7   6   5   4   3   2
  --------------------------------------
    3   2  14  12  10  12   9   6

Los Resultados se Suman y eso da un total

3 + 2 + 14 + 12 + 10 + 12 + 9 + 6 = 68

Despues ese resultado se divide por 11

68 : 11 = 6
2

(El resultado con decimales seria 6,1818181818181818181818181818182, que se aproxima a 2)
EL "RESTO" de la operación se le resta a 11 en este caso seria:

11- 2 = 9


Donde 9 seria el Dígito verificador del RUT.

Ahora, ya se como extraer los primeros 8 numeros que ingresa al usuario, multiplicarlos cada uno, y sumarlos (definitivamente no es para nada dificil hacerlo :)), pero estoy parado en la parte de la division, porque batch solo hace division por numeros enteros, en la division solo me daria el resultado el 6 mas no asi el 2 que es el numero que yo necesito para poder restarlo a 11.-

busque en San Google divisiones con decimales en batch y encontre un par, incluso uno de este foro, pero no supe como adaptarlos a mi code, ademas eran muy largos (con justificada razon supongo, aunque me da lo mismo si es largo o no el code D:) para poder entender lo que hacen, ademas tengo que aproximar la cifra: "6,1818181818181818181818181818182" (tomo el resultado del ejemplo anterior, obviamente esto puede variar) a 2 (se toma del ejemplo anterior), o por lo menos saber el "RESTO" de la operacion como numero entero para poder restarlo a 11, pero ese es mi gran problema, que nose como hacerlo :S, ademas no existe en batch (que yo sepa) una funcion como el "MID" en VB6.0.-

Espero que alguien me pueda ayudar porfavor T_T.-!

De ante mano muchas gracias por las respuestas.-

Asdf debería ser algún tipo de función.

0x0309

#1
eso que buscas se llama módulo que es el resto de la división de enteros.
hice el código, a lo mejor te sirve, o si prefieres escribe tu propia versión.

La parte que buscas es:

set /a "dc=11-suma%%11"


@echo off

:ini
call :getRut
call :validaRut
if errorlevel 1 (
echo.Rut invalido
) else (
echo.Rut valido
)

pause
goto :eof

:getRut
setlocal enableextensions enabledelayedexpansion
set /p rut=Escriba rut:
(endlocal & set "rut=%rut%")
goto :eof

:validaRut
setlocal enableextensions enabledelayedexpansion
if defined rut (set "rut=!rut:.=!")
echo.!rut!|findstr.exe /r /i "\<[0-9]*\-[0123456789K]\>">nul 2>&1
if errorlevel 1 (exit /b 1)
set "numeros=!rut:~0,-2!"
set "n=!numeros!"
set "dv=!rut:~-1!"
set /a "c=2"
set /a "suma=0"
:mult
set "d=!n:~-1!"
set /a "suma+=d*c"
set /a "c+=1"
if !c! gtr 7 (set /a "c=2")
set "n=!n:~0,-1!"
if defined n (goto :mult)
set /a "dc=11-suma%%11"
set "dt=!dc!"
if !dc! equ 10 (set "dt=K")
if !dc! equ 11 (set "dt=0")
set /a ret=1
if /i "!dt!" equ "!dv!" (set /a ret=0)
exit /b !ret!


saludos.

FranciskoAsdf

#2
 :o :o :o :o quede loco xD, osea !
Mi Codigo es algo asi, todo lo que se ve es porke lo estaba probando xD

@echo off

set /P "rut=Ingrese su rut: "
if not defined rut (goto :eof) ELSE (goto :FuncionValidaRut)
:FuncionValidaRut
set "D_Ocho=%rut:~7%"
set "D_Siete=%rut:~6,-1%"
set "D_Seis=%rut:~5,-2%"
set "D_Cinco=%rut:~4,-3%"
set "D_Cuatro=%rut:~3,-4%"
set "D_Tres=%rut:~2,-5%"
set "D_Dos=%rut:~1,-6%"
set "D_Uno=%rut:~0,1%"
ECHO.
ECHO numeros extraidos
echo %D_Ocho% %D_Siete% %D_Seis% %D_Cinco% %D_Cuatro% %D_Tres% %D_Dos% %D_Uno%

:: Multiplicaciones

set /a D_Ocho=D_Ocho*2
set /a D_Siete=D_Siete*3
set /a D_Seis=D_Seis*4
set /a D_Cinco=D_Cinco*4
set /a D_Cuatro=D_Cuatro*6
set /a D_Tres=D_Tres*7
set /a D_Dos=D_Dos*2
set /a D_Uno=D_Uno*3
echo resultado multiplicaciones
Echo %D_Ocho% + %D_Siete% + %D_Seis% + %D_Cinco% + %D_Cuatro% + %D_Tres% + %D_Dos% + %D_Uno%

set /a SumaFinal=%D_Ocho%+%D_Siete%+%D_Seis%+%D_Cinco%+%D_Cuatro%+%D_Tres%+%D_Dos%+%D_Uno%
echo sumafinal
echo %SumaFinal%
echo division de sumafinal por 11
set /a Division=%SumaFinal%/11
echo resultado de la operacion anterior
echo %division%
echo sacamos el resto
set /a resto=%Division%%%11
echo %resto%

echo numero validador
set /a NroValidador=11-%resto%

echo %NroValidador%

IF ["%NroValidador%"]==["10"] (SET "NroValidador=K")
IF ["%NroValidador%"]==["11"] (SET "NroValidador=0")

echo su rut es %rut%-%NroValidador%

Pause
GOTO :EOF


como ves el super rustico xD, ademas de que nunca he sabido como funciona "setlocal enableextensions enabledelayedexpansion", aunque me falta aun filtrar los puntos que pueda ingresar el usuario y varias cosas mas, pero muchas gracias voy a ESTUDIAR tu code, para ver como funciona :)

Saludos y muchas gracias de nuevo!!!!
Asdf debería ser algún tipo de función.