Fonctions de contrôles : siret, siren, ean-13

Soyez le premier à donner votre avis sur cette source.

Snippet vu 23 317 fois - Téléchargée 16 fois

Contenu du snippet

Fonctions permettant de contrôler la validité des numéros SIREN, SIRET et codes-barres de type EAN-13.

Utilisation :

- is_siret(numero_siret) // pour contrôler le numéro SIRET
- is_siren(numero_siren) // pour contrôler le numéro SIREN
- is_ean13(code_ean13) // pour contrôler un code-barres de type EAN13

Ces différentes fonctions renvoient un code erreur :

- 0 : numéro valide
- 1 : nombre de chiffres incorrects
- 2 : valeur non numérique
- 3 : numéro invalide

Exemple d'utilisation :

Créer un tableau d'erreurs :

$erreurs[0] = "numéro valide";
$erreurs[1] = "nombre de chiffres incorrect";
$erreurs[2] = "valeur non numérique";
$erreurs[3] = "numéro invalide";

Pour afficher directement le résultat :

echo $erreurs[is_siren("732829320")];

Pour effectuer un test :

if (is_siren("732829320") == 0)
{
// instructions si numéro valide
}
else
{
// instructions si numéro invalide
}

Source / Exemple :


// fonction permettant de contrôler la validité d'un numéro SIREN
function is_siren($siren)
{
	if (strlen($siren) != 9) return 1; // le SIREN doit contenir 9 caractères
	if (!is_numeric($siren)) return 2; // le SIREN ne doit contenir que des chiffres

	// on prend chaque chiffre un par un
	// si son index (position dans la chaîne en commence à 0 au premier caractère) est impair
	// on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
	// on ajoute cette valeur à la somme totale

	for ($index = 0; $index < 9; $index ++)
	{
		$number = (int) $siren[$index];
		if (($index % 2) != 0) { if (($number *= 2) > 9) $number -= 9; }
		$sum += $number;
	}

	// le numéro est valide si la somme des chiffres est multiple de 10
	if (($sum % 10) != 0) return 3; else return 0;		
}

// fonction permettant de contrôler la validité d'un numéro SIRET
function is_siret($siret)
{
	if (strlen($siret) != 14) return 1; // le SIRET doit contenir 14 caractères
	if (!is_numeric($siret)) return 2; // le SIRET ne doit contenir que des chiffres

	// on prend chaque chiffre un par un
	// si son index (position dans la chaîne en commence à 0 au premier caractère) est pair
	// on double sa valeur et si cette dernière est supérieure à 9, on lui retranche 9
	// on ajoute cette valeur à la somme totale

	for ($index = 0; $index < 14; $index ++)
	{
		$number = (int) $siret[$index];
		if (($index % 2) == 0) { if (($number *= 2) > 9) $number -= 9; }
		$sum += $number;
	}

	// le numéro est valide si la somme des chiffres est multiple de 10
	if (($sum % 10) != 0) return 3; else return 0;		
}

// fonction permettant de contrôler la validité d'un code-barres de type EAN-13
function is_ean13($ean13)
{
	if (strlen($ean13) != 13) return 1; // le code-barres doit contenir 13 caractères
	if (!is_numeric($ean13)) return 2; // le code-barres ne doit contenir que des chiffres

	// on prend chaque chiffre un par un
	// si son index (position dans la chaîne en commence à 0 au premier caractère) est impair
	// on triple sa valeur
	// on ajoute cette valeur à la somme totale

	for ($index = 0; $index < 12; $index ++)
	{
		$number = (int) $ean13[$index];
		if (($index % 2) != 0) $number *= 3;
		$sum += $number;
	}

	$key = $ean13[12]; // clé de contrôle égale au dernier chiffre
		
	// la clé de contrôle doit être égale à : 10 - (reste de la division de la somme des 12 premiers chiffres)
	if (10 - ($sum % 10) != $key) return 3; else return 0;		
}

Conclusion :


Pour plus d'informations, consulter les pages Wikipedia :

- SIRET : http://fr.wikipedia.org/wiki/SIREN
- SIREN : http://fr.wikipedia.org/wiki/SIRET
- EAN 13 : http://fr.wikipedia.org/wiki/Ean_13

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
mercredi 3 février 2010
Statut
Membre
Dernière intervention
9 avril 2015

Salut,
Il n'y aurait pas un problème sur la vérification de la clé de l'EAN 13 ?
Tous les EANs qui se terminent par 0 sont retournés en erreur.
Chez moi, j'ai rajouté if ($key == 0) $key = 10; avant le dernier if autrement il fait Si 10 - 0 != 0 et il plante à chaque fois.
Autrement merci pour ce code qui m'as bien dépanné.
Messages postés
6
Date d'inscription
mercredi 19 octobre 2005
Statut
Membre
Dernière intervention
21 janvier 2009

Merci pour le code il me manquait cela pour ajouter à la classe de codefalse de gestion des formulaire greaaat !
Messages postés
488
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
4
Pour valider le numéro SIRET :

try
{
if(true === SiretValidator::isValid('BCD345FGOUX54'))
{
echo 'SIRET valide';
}
}
catch(Exception $e)
{
echo 'SIRET invalide pour la raison suivante :
';
echo $e->getMessage();
}
Messages postés
488
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
4
Je sais bien mais je dis juste que ce serait plus intéressant d'encapsuler ça dans des classes et des méthodes statiques. Tu fais une classe par validateur avec une méthode statique isValid() par exemple. De plus, cela te permet de lancer des exceptions cohérente plutôt que des return 1; return 2... Ce qui donne au final pour le validateur de numéro Siret :

<?php

class SiretValidator
{
/**
* Contrôle un numéro SIRET
*
* @param string $siret
* @return boolean
* @throws Exception
* @access public
* @static
*/
public static function isValid($siret)
{
if(14 !== strlen($siret))
{
throw new Exception('Un numéro SIRET doit être composé de 14 caractères');
}

if(false === ctype_digit($siret))
{
throw new Exception('Un numéro SIRET n\'est composé que de chiffres');
}

for($index = 0; $index < 14; $index ++)
{
$number = (int) $siret[$index];
if( 0 === ($index % 2))
{
if(($number *= 2) > 9)
{
$number -= 9;
}
}
$sum += $number;
}

if(0 === ($sum % 10))
{
return true;
}

return false;
}
}

try
{
SiretValidator::isValid('BCD345FGOUX54');
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>

C'est tout de même plus propre n'est-ce pas ?

Au passage, is_numeric() renvoie vrai si tu lui fournis un nombre à virgule flottante. Pour valider le format strict d'un entier, on peut utiliser la fonction ctype_digit() ou bien une expression régulière ou bien encore l'extension Filter.

++

Hugo.
Messages postés
32
Date d'inscription
vendredi 19 mai 2000
Statut
Membre
Dernière intervention
21 juillet 2015
>
Messages postés
488
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009

personnellement, je préfère surcharger la class String :

// Ajout des méthodes 'ltrim()', 'rtrim()' et 'trim()' à la class String
String.prototype.trim = function() {
return this.replace(new RegExp('^\\s+|\\s+$', 'g'), '');
}
String.prototype.rtrim = function() {
return this.replace(new RegExp('\\s+$'), '');
}
String.prototype.ltrim = function() {
return this.replace(new RegExp('^\\s+'), '');
}


// Ajout des méthodes 'left()' et 'right()' à la class String
String.prototype.left = function(n) {
return this.substring(0,n);
}
String.prototype.right = function(n) {
return this.substring(this.length-n);
}

// Méthode 'isEmail()' : Permet de contrôler que la donnée représente une adresse email.
String.prototype.isEmail = function() {
var regexp = new RegExp("^[a-zA-Z0-9_\\-\\.]{3,}@[a-zA-Z0-9\\-_\\.]{2,}\\.[a-zA-Z]{2,}$", "g");
return regexp.test(this);
}


// Aout de la méthode 'isEAN()' : permet de contrôler que la donnée est un EAN valide. (EAN8, EAN13, DUN14, SSCC...)
// Rq : cette version ne prend pas en compte les lettres dans les EAN128
String.prototype.isEAN = function() {
var result = false;
if (this.length>1) {
var clef = 0;
var code = this.substring(0,this.length-1).trim();
for(ind=(code.length-1) ;ind>=0; ind-=2) {
clef = clef + parseInt(code.substr(ind,1));
}
clef = clef * 3
for (ind=(code.length-2); ind>=0; ind-=2) {
clef = clef + parseInt(code.substr(ind,1));
}
clef = (10 - (clef % 10)) % 10;
result = (this.trim() == code + clef)
}
return (result)
}


Il suffit de mettre ce code dans un .js et l'inclure dans les pages html. L'utilisation en est alors très simple :

var toto = "1234567895";
if (toto.trim()=="123456") { .... }
else if (toto.isEAN()) { .... }
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.