Wątek zablokowany 2016-02-26 02:30 przez furious programming.

Generowanie numeru NIP

0

Mam w Ruby generator NIP, który wygląda tak (sekwencja dla FactoryGirl):

  sequence :nip do |n|
    srand(n)
    sum = 10
    nip = []
    while sum == 10
      nip = Array.new(9) { rand(10) }
      sum = nip.zip([6, 5, 7, 2, 3, 4, 5, 6, 7]).map{|a| a.inject(&:*)}.inject(&:+) % 11
    end
    (nip << sum).join
  end

Jednak nie zawsze zwraca mi to poprawny numer, dlaczego? Co jest tutaj źle?

Funkcja sprawdzająca wygląda tak:

    def nip_valid?(nip)
      if nip =~ /^\d{10}$/
        nums = nip.split(//).map(&:to_i)
        check = nums.pop
        sum = nums.zip([6, 5, 7, 2, 3, 4, 5, 6, 7]).map{|a| a.inject(&:*)}.inject(&:+)
        return sum % 11 == check
      else
        false
      end
    end

// EDIT: trochę poprawiłem

0

Z tego co mnie pamięć nie myli trzy pierwsze cyfry w NIP są z zakresu 111-998 z pominięciem liczb zawierających 0 na którejkolwiek pozycji. W takim wypadku algorytm dla niektórych NIPów może się sypać np. zwracana jest liczba mająca mniej cyfr niż trzeba (i dlatego kochamy dynamiczne typowanie). Do tego może dojść jeszcze przypadek gdzie mod 11 zwróci 10. Wtedy numer też będzie nieprawidłowy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1