Algorithm-CheckDigits

 view release on metacpan or  search on metacpan

lib/Algorithm/CheckDigits/M10_004.pm  view on Meta::CPAN

package Algorithm::CheckDigits::M10_004;

# vim: set tw=78 sw=4 ts=4 si sr et:

use 5.006;
use strict;
use warnings;
use integer;

use version; our $VERSION = 'v1.3.6';

our @ISA = qw(Algorithm::CheckDigits);

my $valid_prefix = {
    isbn13 => {
        978 => 1,
        979 => 1,
    },
    issn13 => { 977 => 1, },
};

sub new {
    my $proto = shift;
    my $type  = shift;
    my $class = ref($proto) || $proto;
    my $self  = bless( {}, $class );
    $self->{type} = lc($type);
    return $self;
}    # new()

sub is_valid {
    my ( $self, $number ) = @_;
    if ( $number =~ /^([0-9 -]+)([0-9])$/ ) {
        return $2 == $self->_compute_checkdigit($1);
    }
    return '';
}    # is_valid()

sub complete {
    my ( $self, $number ) = @_;
    if ( $number =~ /^[0-9 -]+$/ ) {
        return $number . $self->_compute_checkdigit($number);
    }
    return '';
}    # complete()

sub basenumber {
    my ( $self, $number ) = @_;
    if ( $number =~ /^([0-9 -]+)([0-9])$/ ) {
        return $1 if ( $2 == $self->_compute_checkdigit($1) );
    }
    return '';
}    # basenumber()

sub checkdigit {
    my ( $self, $number ) = @_;
    if ( $number =~ /^([0-9 -]+)([0-9])$/ ) {
        return $2 if ( $2 == $self->_compute_checkdigit($1) );
    }
    return '';
}    # checkdigit()

sub _compute_checkdigit {
    my $self   = shift;
    my $number = shift;
    $number =~ s/[ -]//g;
    if ( $number =~ /^([0-9]*)$/ ) {
        if ( $valid_prefix->{ $self->{type} } ) {
            my $prefix = substr $number, 0, 3;
            unless ( $valid_prefix->{ $self->{type} }->{$prefix} ) {
                return -1;
            }
        }
        my @digits = split( //, $number );
        my $even   = 1;
        my $sum    = 0;
        for ( my $i = $#digits; $i >= 0; $i-- ) {
            if ($even) {
                $sum += 3 * $digits[$i];
            }
            else {
                $sum += $digits[$i];
            }
            $even = not $even;
        }
        return ( 10 - $sum % 10 ) % 10;



( run in 0.672 second using v1.01-cache-2.11-cpan-5a3173703d6 )