Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Ejercicio clase NIF

Estas en el tema de Ejercicio clase NIF en el foro de PHP en Foros del Web. Hola comunidad estoy practicando programación orientada a objetos y estoy realizando la siguiente clase, pero primero dejo el enunciado. Cita: Crea una clase NIF que ...
  #1 (permalink)  
Antiguo 09/11/2015, 17:13
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 9 años
Puntos: 7
Ejercicio clase NIF

Hola comunidad estoy practicando programación orientada a objetos y estoy realizando la siguiente clase, pero primero dejo el enunciado.

Cita:
Crea una clase NIF que se usará para mantener DNIs con su correspondiente letra.
Los atributos serán el número de DNI (entero largo) y la letra que le corresponde.
La clase dispondrá de los siguientes métodos:
  1. Constructor predeterminado que inicialice el nº de DNI a 0 y la letra a espacio en blanco (será un NIF no válido).
  2. Constructor que reciba el DNI y establezca la letra que le corresponde.
  3. leer() : que pida el número de DNI (ajustando automáticamente la letra)
  4. Método que nos permita mostrar el NIF (ocho dígitos, un guión y la letra en mayúscula; por ejemplo: 00395469-F)

La letra se calculará con un método auxiliar (privado) de la siguiente forma:
se obtiene el resto de la división entera del número de DNI entre 23 y se usa l
siguiente tabla para obtener la letra que corresponde:

0 - T 1 - R 2 - W 3 - A 4 - G 5 - M 6 – Y
7 - F 8 - P 9 - D 10 - X 11 - B 12 - N 13 – J
14 - Z 15 - S 16 - Q 17 - V 18 - H 19 - L 20 – C
21 - K 22 – E
Esta seria la clase:

Código PHP:
Ver original
  1. <?php
  2. class Nif {
  3.     private $dni;
  4.     private $dniLetra;
  5.    
  6.     public function __construct($dni=0, $letra="") {
  7.        if($dni != 0) {
  8.         $this->dni = $dni;
  9.         $this->dniLetra = $letra;
  10.         $this->generarLetra();
  11.        }
  12.        else {
  13.            echo 'NIF no valido!!';
  14.        }
  15.        
  16.     }
  17.    
  18.     public function leer ($dniNuevo) {
  19.         $this->dni = $dniNuevo;
  20.        
  21.         $this->generarLetra();
  22.     }
  23.    
  24.     private function generarLetra() {
  25.         $letra = 'TRWAGMYFPDXBNJZSQVHLCKE';
  26.         //Calculo el resto del DNI
  27.         $resto = $this->dni % 23;
  28.        
  29.         //Concateno la letra con el DNI
  30.         for($i = 0; $i < strlen($letra); $i++) {
  31.             if($resto == $i) {
  32.                 $this->dni .= '-'.$letra[$i].'<br />';
  33.                 break;
  34.             }
  35.         }
  36.     }
  37.    
  38.     public function mostrar () {
  39.         echo $this->dni;
  40.     }
  41. }
  42.  
  43. $nif = new Nif(11395461);
  44. $nif->mostrar();
  45. ?>

Explico un poco la clase Nif posee dos propiedades que son $dni y $dniLetra, despues creo un constructor para que pasen el dni y la letra y ala vez llamo al metodo generarLetra que lo que hace es buscar la posición de un caracter en la cadena $letra. la letras estan ubicadas con la misma posicion del enunciado. Si el resto de la divición de DNI /23 es igual ala posición de la cadena concateno la posición de la letra y paro el bucle. Hasta funciona de diez.

El tema es que cuando me ingresan un DNI ejemplo con 00382036, la propiedad toma solo el 3. Dejo un ejemplo de programación estructurada para que se entienda.

Código PHP:
Ver original
  1. <?php
  2. $letra = 'TRWAGMYFPDXBNJZSQVHLCKE';
  3. $dni = 00382036;
  4.  
  5. echo $dni.'<br />';
  6.  
  7. $resto = $dni % 23;
  8.  
  9.  
  10. for($i = 0; $i < strlen($letra); $i++) {
  11.       if($resto == $i) {
  12.          $dni.= '-'.$letra[$i];
  13.          break;
  14.       }
  15. }
  16. echo 'Cuando sale del bucle '.$dni;
  17. ?>

La teoria dice esto:

Cita:
La letra del NIF se obtiene a partir de un algoritmo conocido como módulo 23. El algoritmo consiste en aplicar la operación aritmética de módulo 23 al número del DNI. El módulo 23 es el número entero obtenido como resto de la división entera del número del DNI entre 23. El resultado es un número comprendido entre el 0 y el 22. En base a una tabla conocida se asigna una letra. La combinación del DNI con esa letra es el NIF.

Este mismo algoritmo también puede utilizarse para el cálculo del NIE. En el caso que el NIE empiece por X, se calcula despreciando la X y utilizando los 7 dígitos, si el NIE empieza por Y, se sustituye la letra Y por el número 1, si el NIE empieza por Z, se sustituye la letra Z por el número 2 y se realiza el mismo cálculo.

El algoritmo no se aplica para obtener el Código de Identificación Fiscal (CIF), que es el "NIF" propio de las personas jurídicas, pues la letra que tiene no se basa en una fórmula, sino que identifica el tipo de entidad (p.e. B para Sociedades Limitadas; G para Asociaciones sin ánimo de lucro y otros tipos no definidos, etc.).
Yo tendria que hacer algo cuando el DNI empieza con 0.

¡Saludos y muchas gracias desde ya!

Una de las soluciones, pasandole un string al DNI si hace bien el calculo, se le pasamos INT que empiece con 0 ala izquieda el calculo lo hace mal. Es decir solo te toma el siguiente numero despues del 0.

Última edición por gonzaherrera77; 09/11/2015 a las 17:30
  #2 (permalink)  
Antiguo 09/11/2015, 18:20
 
Fecha de Ingreso: enero-2015
Ubicación: Cordoba, Andalucía
Mensajes: 111
Antigüedad: 9 años, 10 meses
Puntos: 15
Respuesta: Ejercicio clase NIF

Lo tienes chungo, has probado entrecomillando el nif?

Código PHP:
Ver original
  1. $nif = new Nif("00395461");
  #3 (permalink)  
Antiguo 09/11/2015, 18:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Ejercicio clase NIF

Esto es un problema:
Código PHP:
Ver original
  1. // MAL
  2. $dni = 00382036;
  3.  
  4. // BIEN
  5. $dni = '00382036';

¿Por qué?

La notación octal comienza con 0, eso lo puedes consultar en el manual.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 09/11/2015, 20:32
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 9 años
Puntos: 7
Respuesta: Ejercicio clase NIF

Cita:
Iniciado por MrGilbertMan Ver Mensaje
Lo tienes chungo, has probado entrecomillando el nif?

Código PHP:
Ver original
  1. $nif = new Nif("00395461");
Asi es MeGilbertMan

pateketrueke muchas gracias por la info, marco como solucionando entonces.

¡Saludos!

Etiquetas: clase, ejercicio, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:09.