Autor Tema: validacion de SIN  (Leído 3803 veces)

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

Desconectado moyo18

  • The Communiter-
  • *
  • Mensajes: 1719
validacion de SIN
« : octubre 13, 2008, 10:48:42 am »
bueno en un post hace un par d dias pregunte como se sumaban un par d numeros usando un FOR, ahora vengo con lo mismo ya q no me sirve con lo que estoy haciendo.

Explicare bien mi problema.

1- mi programa ya esta listo y funciona perfectamente, pase un buen rato googleando y atando cabbos de como funcionaria, les explico que hace.

mi programa pide el SIN (social insurance number) d aqui de canada, y despues se verifica si el numero es valido o nop. la verificacion de ese numero lleva un proceso por ejemplo

234234767 = ese es un sin q tiene 9 numeros pero no es valido supongo xD, para saber si es valido se hace esto

cada segundo numero se multriplica por 2

3 * 2
2 * 2
4 * 2
6 * 2

el resultado se si da menor que 10 se deja asi, pero si da mayor q 10 entonces se suman los numeros por ejemplo 12 = 1 + 2 = 3

ahora q tiene los resultados se suman con los demas numeros q sobraron 24377

el resultado de divide por 10, si es divisible ese numero por 10 entonces el SIN es valido.

ahora mi profesor me podio hacer eso con FOR y no se como hacerlo, lo q hice fue extraer los numeros uno a uno y luego hacer la operacion.

y use un while ya q si el sin es menor q 0 entonces el programa tendria q terminiar ahi. aki les dejo el codigo

Código: [Seleccionar]
import java.util.Scanner;


public class ValidateSIN
{
    public static void main(String[] args)
    {
        Scanner keyboard = new Scanner(System.in);
        String sin ;
        int num0, num1, num2, num3, num4, num5, num6, num7, num8;
        int sinSize;
        int second, fourth, sixth, eighth, total, validation, sinInteger;
       
        System.out.println("Enter your Social Insurance Number: ");
        sinInteger = keyboard.nextInt();
 
       
       
        while (sinInteger > 0 )
        {   
               sin = Integer.toString(sinInteger);
 
               sinSize = sin.length();
               if (sinSize != 9 )
                    System.out.println("Invalid input. Please try again.");
               else
               {
                num0 = Character.getNumericValue(sin.charAt(0));
                num1 = Character.getNumericValue(sin.charAt(1));
                num2 = Character.getNumericValue(sin.charAt(2));
                num3 = Character.getNumericValue(sin.charAt(3));
                num4 = Character.getNumericValue(sin.charAt(4));
                num5 = Character.getNumericValue(sin.charAt(5));     //como hacer todae sta parte en un for si se puede o como
                num6 = Character.getNumericValue(sin.charAt(6));    // sumar los unicos 4 digitos q no se modifican
                num7 = Character.getNumericValue(sin.charAt(7));   
                num8 = Character.getNumericValue(sin.charAt(8));


                second = num1 * 2;
                fourth = num3 * 2;
                sixth = num5 * 2;
                eighth = num7 * 2;
           
                if (second >= 10)
                    second = second - 9;
                if (fourth >= 10)
                    fourth = fourth - 9;
                if (sixth >= 10)
                    sixth = sixth - 9;
                if (eighth >= 10)
                    eighth = eighth - 9;
           
           
           
            total = num0 + num2 + num4 + num6 + num8 + second  + fourth  + sixth + eighth;
           
            validation = total % 10;
           
           
            if (validation == 0)
                System.out.println("Your SocialInsurance Number is Valid... SIN: " + sin);
            else
                System.out.println("Invalide SIN");
            }
         
            System.out.println("Enter your Social Insurance Number: ");
            sinInteger = keyboard.nextInt();
           
         
           
       }
       System.out.println("Program ENDS");
           
    }
}

y q mas se puede sacar usando FOR porq intenten con esto para los 5 numeros q nada mas se suman no se modifican

Código: [Seleccionar]
sinSlots = Integer.parseInt(sin.substring(i,i+1));
na mas q usando las variables claro del programa pero en evz de 1 pongo 2 para q se sumen  cada 2 numeros dentro del string y me da un error q se pasa del rango del string y llega a 10...

a tambien se me olvido mencionar q en el programa pido el sin primero como integer y luego lo convierto a string para hacer lo de las varibles..

Character.getNumericValue   

use es ya q en google encontre q para chartAt tenia q usar ese para q me diera cabal la cantidad, porq solo usando sin.chartAt no me funcionaba y ni substring tampoco.

a ver sis alguien me da una yudita con los fors

Desconectado moyo18

  • The Communiter-
  • *
  • Mensajes: 1719
Re: validacion de SIN
« Respuesta #1 : octubre 14, 2008, 04:08:32 pm »
hey bueno nadie me ayudo :( pase googleando hasta q medio encontre algo q me ayudo un vergo, aki esta el programa y el ejecicio resuelto

Código: [Seleccionar]
import java.util.Scanner;
/**
   This program checks if the social insurance
   number is valid.
   * @author (moyo)
   * @version (1.0 Oct 18, 2008)
*/

public class ValidateSIN
{
    public static void main(String[] args)
    {
       
        String sin;
        int sinInteger, sinSize, sinSlots, sumodds, sumeven, multSlot, validation;
       
       
        Scanner keyboard = new Scanner(System.in);
       
        System.out.println("Enter your Social Insurance Number: ");
        sinInteger = keyboard.nextInt();
       

        while ( sinInteger > 0 )
        {
           
            sin = Integer.toString(sinInteger);
           
            sinSize = sin.length();
            if ( sinSize != 9 )
                System.out.println("Invalid");
            else
            {
               
                sumodds = 0;
                for(int i=0;i<sinSize;i +=2)
                {
                    sinSlots = Integer.parseInt(sin.substring(i,i+1));
                    sumodds +=  sinSlots;
                }
                             
                sumeven = 0;
                multSlot = 0;
                for(int i=1;i<sinSize;i +=2)
                {
                    sinSlots = Integer.parseInt(sin.substring(i,i+1));
                    multSlot = sinSlots*2;
                    if (multSlot >= 10)
                        sumeven += (multSlot - 9);
                    else
                        sumeven += multSlot;
                }
               
                validation = (sumeven + sumodds) % 10;
                if (validation == 0)
                    System.out.println("Your Social Insurance Number is Valid... SIN: " + sin);
                else
                    System.out.println("Your Social Insurance Number is Invalid");
                 
               
            }
           
            System.out.println("Enter your Social Insurance Number: ");
 
        }                       
             
        System.out.println("Program ENDS");       

       }
}


Ahora si tengo otro problema a ver si el camus me ayuda aki

mi problema esta en q solo acepta INTEGERS al principio para validar si el sin es menor q cero entonces se termine el programa.... la cosa es q si pongo CARACTERES el programa crash y si me paso de 10 digitos el programa igual crash.

ya intentete con strings primero luego convertir a integer y hcaer la onda del while pero no furulo y no se ocmo hacer para chekear si la variable sininteger lleva char... he buscado en google peo solo encuentro string to int check... pero no lo contrario q seria int to str check


Desconectado Camus de Acuario

  • The Communiter-
  • *
  • Mensajes: 8455
  • Ōrora Ekusukyūshon!
Re: validacion de SIN
« Respuesta #2 : octubre 14, 2008, 11:08:29 pm »
ayudando al compañero moyo

Código: [Seleccionar]
import java.util.Scanner;

/**
   This program checks if the social insurance
   number is valid.
   * @author (Ronald Iraheta)
   * @version (1.0 Oct 18, 2008)
*/

public class validatesin3
{
    public static void main(String[] args)
    {
       
        String sin, sinString;  //Get the Sin number as a string
        int sinInteger, sinSize, sinSlots, sumodds, sumeven, multSlot, validation; // Variables to use for the validation

        Scanner keyboard = new Scanner(System.in);
       
       
        //Obtein the SIN number from the user
        System.out.println("Enter your Social Insurance Number: ");
        sinString = keyboard.nextLine();
       
        //while to end the program if sin is less then 0
        while ( !sinString.equals("0") )
        {
            //Convert the sinInterger to a Strin value
            //sin = Integer.toString(sinInteger);
            sin = sinString;
            //Check if the sin length are 9 digits
            sinSize = sin.length();
           
            if (!isNumeric(sinString))
            {
            System.out.println("Invalid Input");
            }
            else
            {
            if ( sinSize != 9 )
                {
                System.out.println("Invalid Input");
                }   
                else
                {
                    //Sum of the odd digits from the string [1,3,5,7,9]
                    sumodds = 0;
                    for(int i=0;i<sinSize;i +=2)
                    {
                        //Extract the string slots from sin to calculate the sum
                        sinSlots = Integer.parseInt(sin.substring(i,i+1));
                        sumodds +=  sinSlots;
                    }
                                   
                    //Sum of the even digits from the string [2,4,6,8]
                    sumeven = 0;
                    multSlot = 0;
                    for(int i=1;i<sinSize;i +=2)
                    {
                        //Extract the string slots from sin to calculate to multiply
                        sinSlots = Integer.parseInt(sin.substring(i,i+1));
                        //sinSlots multiply by 2
                        multSlot = sinSlots*2;
                        //if statement to add the numbers if they are greater then 10 if not sum the results from multSlot
                        if (multSlot >= 10)
                            sumeven += (multSlot - 9);
                        else
                            sumeven += multSlot;
                    }
                    //Validation of SIN....
                    validation = (sumeven + sumodds) % 10;
                    if (validation == 0)
                        System.out.println("Your Social Insurance Number is Valid... SIN: " + sin);
                    else
                        System.out.println("Your Social Insurance Number is Invalid");
                     
                }
            }
           
           System.out.println("Enter your Social Insurance Number: ");
            sinString = keyboard.nextLine();
        }
       
        //Program ENDS when a negative value is entered     
        System.out.println("Program ENDS");       
       
       }
   
    private static boolean isNumeric(String cadena){
    try {
    Integer.parseInt(cadena);
    return true;
    } catch (NumberFormatException nfe){
    return false;
    }
    }
}

Modificado, despues de un bug, si tenes justo 9 caracteres entre digitos y alfanumericos y/o simbolos:

1. Sin valida si:
   -Tiene 9 caracteres, todos numerosy en efecto la sin es valida segun la formula
2. Sin invalida si:
   -Tiene 9 caracteres, todos numeros pero no es valida segun la formula
3. Input invalido si:   
   -Tiene 9 caracteres, entre numeros, alfanumericos y/o simbolos
   -Tiene menos de 9 caracteres todos numeros
   -Tiene mas de 9 caracteres todos numeros
   -Tiene 9 caracteres y son alfanumericos y/o simbolos
   -Tiene menos de 9 caracteres y son alfanumericos y/o simbolos
   -Tiene mas de 9 caracteres y son alfanumericos y/o simbolos
4. El programa termina si:
   -Se ingresa un 0 (cero)
« Última Modificación: octubre 14, 2008, 11:33:48 pm por Camus de Acuario »

Desconectado moyo18

  • The Communiter-
  • *
  • Mensajes: 1719
Re: validacion de SIN
« Respuesta #3 : octubre 15, 2008, 02:25:17 pm »
si funciona perfecto na mas explica un poco a los demas la prate del try

Código: [Seleccionar]
private static boolean isNumeric(String cadena){
    try {
    Integer.parseInt(cadena);
    return true;
    } catch (NumberFormatException nfe){
    return false;
    }
    }

porq es boolean... cadena ? y que hace numberformatexception y que es nfee xD


a esta parte no la entendi

Código: [Seleccionar]
if (!isNumeric(sinString))
            {
            System.out.println("Invalid Input");
            }
« Última Modificación: octubre 15, 2008, 02:42:36 pm por moyo18 »

Desconectado Camus de Acuario

  • The Communiter-
  • *
  • Mensajes: 8455
  • Ōrora Ekusukyūshon!
Re: validacion de SIN
« Respuesta #4 : octubre 15, 2008, 02:39:29 pm »
veamos

1- String cadena es el parametro que le pasas para ver si es numerico

2- Es boolean porque retorna true o false segun su contenido

3- La parte del try/catch para capturar errores, sirve asi, cuando haces un programa este está propenso a errores, si en ejecucion se genera un error, el programa se corta o "crashea" como algunos dicen, los try/catch son para capturar errrores, los pones donde crees que pueda haber un error, coneccion con alguna bd, leer un archivo, algo fuera de comun, adentro del try pones lo que queres que se ejecute y en el catch lo que pasaria si hubiese error. Por lo tanto en el catch va el mensaje bonito de: "El tipo de dato que quiere guardar no es valido" en lugar de que se corte el programa y te salga un mensaje de:
Citar
ERROR 46497adfaa6d4fa6sf7a-fuck-you-9df8as9fsd4!!!!!!!! invalid data type inserted in table mstablita1quenopodesmeterdatos

aplicando esto a la funcion isNumeric
-Le pasas una cadena a isNumeric, con la forma isNumeric(cadena)

-en el try lo que hace es convertir la cadena en entero, si la cadena esta formada por puros digitos, 123456, 0000899, 989898, etcetera la conversion no tiene problema alguno y con el return true se acaba la funcion y su respuesta es true, por lo que si pones: isNumeric("1") te tiene que dar como resultado: true

-eso en dado caso de que la cadena se pueda convertir a entero, si le pasas una cadena "hola" o "cadena 3" y tratas de convertirla a entera, va a dar un error de conversion de datos que lo atrapas en el catch, y la instancia de ese error se llamará nfey el tipo de error es NumberFormatException, como atrapaste ese error, la funcion retornará false, asi si pones: isNumeric("hola") te va a salir: false

ese es el funcionamiento del try/catch. si quieren saber mas de este tema pueden ir a:
Citar
http://www.tutorial-lab.com/tutoriales-java/id35-uso-de-try-y-catch-en-java.aspx


EDIT:

a esta parte no la entendi

Código: [Seleccionar]
if (!isNumeric(sinString))
            {
            System.out.println("Invalid Input");
            }

como queres que el programa te rechace si le metes una cadena que no sea numeros de 9 digitos, primero pasas:
-sinString es la cadena que metiste, 123456789 o abcdefghi o 1a2b3c4d5
-if(!isNumeric(sinString)) se lee:
si el dato en sinString no es numero: mandar a imprimir "Invalid Input"

el ! te hace la negacion, si pones isNumeric(5) te devuelve true, entonces, es en el if: si no es true imprimir "Invalid Input" pero como si es true, entra en el else
« Última Modificación: octubre 15, 2008, 02:49:37 pm por Camus de Acuario »