Results 1 to 7 of 7
-
12-01-2003, 06:37 AM #1Web Hosting Master
- Join Date
- Jul 2002
- Location
- Sweden
- Posts
- 2,059
Converting javascript to php - need some help, please
I am building an addition to a shopping cart I have developed. We are going to accept payment from invoices, not just cc or "paying when you get the package from the post office".
In Sweden people and organisations have a special number in this pattern: 112233-4455
If it's a person the firts six numbers is the date of birth.
The number uses the last digit as a check, and the rest is calculated by multiplying with 2 or 1 starting from the first number, like this:
1*2 1*1 2*2 2*1 3*2 3*1 4*2 4*1 5*2
If the result is greater than 9, the two didgits are separated.
Then all the results are added like this:
2+1+4+2+6+3+8+4+1+0 (5*2=10 wich gives 1+0)
The result is then checked to see what is left to get a zero on the end:
31 needs 9 to get to 40 (zero on the end)
Check the result to the control to see if it's a valid number:
Check digit is 5, result is 9, this is not a valid number!
So... programming this isn't easy, so I decided to see if someone else had done something similar. I found a script written in javascript and it isn't exactly what I want, but I know I can adapt it, IF I can convert it to PHP.
I need your help. I have marked the parts I will use and adapt, so unless it's extremely woven into it, the other parts don't need to be translated. (I have searched the net to find a converter, but so far, no luck)
Script:
PHP Code:// Validerar personnummer. 12 siffror. Inga bindestreck. Koll av sista siffran.
//(Validates personal number. 12 digits. No hyphen. Check of last digit.)
function PersonnummerOK(pnr) {
var ok = true;
// var answer = "";
var length_pnr = pnr.length;
trmp_nr = 0;
del_nr = 0;
sum_nr = 0;
temp_str = "";
ej_nr = false;
// Kontroll av att fältet ej är tomt
//(Controll: Is field empty?)
if (pnr == "") {
return false
// answer += "tomt" //Tomt = Empty
}
// Kontroll av att fältet innehåller exakt 12 tecken
//(Does field have exactly 12 numbers?)
if (length_pnr != 12) {
return false
// answer += "\n fel längd: " + length_pnr
}
// Loopa igenom alla tecken och kontrollera att de är siffror
//(Loop through all signs, make sure they're digits.)
for (i=1; i < 13; i++) {
ej_nr = isNaN(parseInt(pnr.substring((i-1),i)));
if (ej_nr == true) {
return false;
// alert("tecken nr:" + (i-1) +"är ej en siffra " + pnr.substring((i-1),i))
};
};
// Kontrollera att de två första siffrorna är 19.
//(Control that first didgits are 19)
if (pnr.substring(0,2) != "19") {
return false
// answer += "\n Börjar ej med 19: " + pnr.substring(0,2)
}
// Beräkning av korrekt personnummer.
//(Calculate correct number).
//This is where the part starts I think I need to use.
// Loopa igenom tecken 3 till 11 (dvs personnumret utan 19 i början och exklusive sista tecknet) och summera
//(Loop through numbers 3 to 11 and add).
for (i=3; i < 12; i++) {
temp_nr = parseInt(pnr.substring((i-1),i));
// Om i är udda tal multipliceras med 2, annars med 1 (If uneven, multiply with 2, otherwise with 1)
if (i % 2 == 0) {
sum_nr += temp_nr
} else {
// Om 2*talet blir tvåsiffrigt summeras de två siffrorna för sig
//(If 2 * number is 2 digits, add numbers separatly)
if ((2*temp_nr) > 9) {
del_nr = parseInt((temp_nr*2)/10);
sum_nr += del_nr + ((2*temp_nr) - (del_nr*10))
} else {
sum_nr += 2*temp_nr
}
}
}
// Kontroll av att sista siffra stämmer med den uträknade
//(Check the last didgit to the calculated one)
temp_nr = 0;
temp_nr = parseInt((sum_nr + 10)/10)*10 - sum_nr;
if (temp_nr == 10) temp_nr = 0;
if (temp_nr != parseInt(pnr.substring(11,12))) {
return false;
};
// alert("Personnumret är OK")
return ok;
};
"Stop flame-wars - Report a post"
The original Kitty Lizard
-
12-01-2003, 09:49 AM #2Newbie
- Join Date
- Dec 2003
- Location
- Tampa Area FL
- Posts
- 27
Hello,
Im not a big javascript person but i do know PHP very profficiently.
give me a second and ill whip you something up
-
12-01-2003, 09:56 AM #3Web Hosting Master
- Join Date
- Jul 2002
- Location
- Sweden
- Posts
- 2,059
Great!
-
12-01-2003, 10:34 AM #4Newbie
- Join Date
- Dec 2003
- Location
- Tampa Area FL
- Posts
- 27
This should do the trick if i understand exactly what it is you are trying to do
PHP Code:<?PHP
function validate_personal_num($number)
{
// get length of string
$length = strlen($number);
$length--;
// make the string an array of each integer.
for($i = 0; $i <= $length; $i++)
{
if(is_numeric($number{$i}))
{
$nums_array[] = $number{$i};
}
}
$j = count($nums_array)-2;
$multiplier = 2;
$total_count = 0;
for($i = 0; $i <= $j; $i++)
{
$total = ($nums_array[$i] * $multiplier);
if($total <= 9)
{
$total_count += $total;
}
else
{
$total_count += 1 + ($total -10);
}
// check the multiplier and reverse it.
if($multiplier == 2)
{
$multiplier = 1;
}
else
{
$multiplier = 2;
}
}
// now check to see if $total_count + check number is divisible by 10
$i = count($nums_array) - 1;
$check_number = $nums_array[$i];
if(($total_count + $check_number) % 10 != 0)
{
return FALSE;
}
else
{
return TRUE;
}
}
$number = "112233-4455";
if(!validate_personal_num($number))
{
echo "incorrect number supplied";
}
?>Last edited by PHPConcepts; 12-01-2003 at 10:44 AM.
Erik S.
Developer / Owner
-
12-01-2003, 04:22 PM #5Newbie
- Join Date
- Dec 2003
- Location
- Tampa Area FL
- Posts
- 27
i take it everything worked out ok?
if not let me know what needs to be done differentlyErik S.
Developer / Owner
-
12-02-2003, 04:13 AM #6Web Hosting Master
- Join Date
- Jul 2002
- Location
- Sweden
- Posts
- 2,059
Thanks! I will check it out. Sorry I didn't answer earlier, but my tiemzone must be different from yours and I'm at work when I'm on-line.
I just ran ut, and it works great Thank you so much.
I know there are so many different ways of approaching a problem. Your approach seem very simple, and is probably something similar to what I would have come up with, if I hadn't been stuck on trying to translate the javascript I found.Last edited by Reptilian Feline; 12-02-2003 at 04:27 AM.
"Stop flame-wars - Report a post"
The original Kitty Lizard
-
12-02-2003, 10:18 PM #7Newbie
- Join Date
- Dec 2003
- Location
- Tampa Area FL
- Posts
- 27
Im glad i could help
Erik S.
Developer / Owner