# Validera ett svenskt personnummer i Ruby
# jonelf@gmail.com
require 'date.rb'
pnum=ARGV[0]
if pnum==nil then
print "Ange personnummer som yyyyMMddcccc.\n"
exit
elsif pnum.length!=12 then
print "Det skall vara 12 siffror."
else
begin
date=DateTime.strptime(pnum[0,4] +'-'+ pnum[4,2] +'-'+ pnum[6,2], '%F')
rescue ArgumentError => argerr
printf("%s är inte ett riktigt datum.\n", pnum[0,8])
exit
rescue Exception => ex
print ex.to_s
exit
end

checksum=0
pos=0

n=0
0.upto(9) do |pos|
n=pnum[pos+2].to_i-48
if pos%2==0 then
checksum+=(n*2).modulo(9)+(n/9)*9
else
checksum+=n
end
end

if checksum%10==0 then
print "Personnumret har ett korrekt datum och en korrekt checksumma.\n"
else
printf("Personnumret är inte korrekt. Checksumman skall vara jämnt delbar med 10 men är %d.\n", checksum)
end
end