Validateur isbn (10 chiffres) et issn (8 chiffres)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 913 fois - Téléchargée 28 fois

Contenu du snippet

Ce code contient quatres modules permettant la validation de ISSN et de ISBN avec ou sans tirets. De plus, le code contient un example de leur utilisation qui est de toute façon assez simple.

Source / Exemple :


#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <sstream>

using namespace std;

/****

  • SéparerCode :
  • Sépare le code donné en un vecteur de int et met la clé à la fin.
  • /
void SéparerCode(std::vector<int>& p_codeSéparé, const std::string& p_code) { bool valide= true; string::size_type posRecherche= 0; for (int i= 0; i != p_code.size(); ++i) { if (p_code[i] != '-') { int nb; // Nombre à être pris du code. istringstream iss(p_code.substr(posRecherche, 1)); iss >> nb; // On essaie de lire un nombre. if (iss.fail()) // Le caractère était vide ou n'était pas un chiffre. { // Si le dernier caractère est égal à X alors // la valeur 10 lui est assigné. if (i == p_code.size()-1 && toupper(p_code[i]) == 'X') nb= 10; else valide= false; } p_codeSéparé.push_back(nb); } ++posRecherche; } // Si le code contient autre chose que des tirets, des chiffres et le X de la clé // on met le size du vecteur p_codeSéparé à 1 pour qu'il ne soit pas valide. if (! valide) p_codeSéparé.resize(1); } /**** int CléDuCode(const std::vector<int>& p_codeSéparé) { int sommeDesMultiplications= 0; // p_codeSéparé.size()-1 pour ne pas compter la clé de validation dans le calcul. for (int i= 0; i != p_codeSéparé.size()-1; ++i) sommeDesMultiplications+= p_codeSéparé[i] * (p_codeSéparé.size() - i); return 11 - (sommeDesMultiplications % 11); } bool IsbnValide(const std::string& p_isbn) { //### vector<int> codeSéparé; // Les nombres du codes séparés pour calculer la clé. SéparerCode(codeSéparé, p_isbn); if (codeSéparé.size() < 10) // Le ISBN doit contenir 10 nombres. return false; return CléDuCode(codeSéparé) == codeSéparé.back(); } bool IssnValide(const std::string& p_issn) { //### vector<int> codeSéparé; // Les nombres du codes séparés pour calculer la clé. SéparerCode(codeSéparé, p_issn); if (codeSéparé.size() < 8) // Le ISSN doit contenir 8 nombres. return false; return CléDuCode(codeSéparé) == codeSéparé.back(); } int main() { string isbn= "0-306-40615-2"; cout << "0-306-40615-2 attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2-266-11156-6 (2)"; cout << "2-266-11156-6 (2) attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2864971895"; cout << "2864971895 attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2709816288"; cout << "2709816288 attendu -> VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "286X971895"; cout << "286X971895 attendu -> NON VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "2-236-11156-X"; cout << "2-236-11156-X attendu -> NON VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; isbn= "203582633X"; cout << "203582633X attendu -> NON VALIDE |<>| " << (IsbnValide(isbn.substr(0, 13)) ? "VALIDE" : "NON VALIDE") << "\n\n"; cout << "--Continuer--"; cin >> isbn; cin.ignore(); string issn= "0317-8471"; cout << "0317-8471 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0361-686X"; cout << "0361-686X attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0065-0382"; cout << "0065-0382 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0190-2946"; cout << "0190-2946 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0001-9836"; cout << "0001-9836 attendu -> VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0261-686X"; cout << "0361-686X attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "006503824"; cout << "006503824 attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0190-f946"; cout << "0190-2946 attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; issn= "0001-983X"; cout << "0001-9836 attendu -> NON VALIDE |<>| " << (IssnValide(issn.substr(0, 9)) ? "VALIDE" : "NON VALIDE") << "\n\n"; }

Conclusion :


Si vous trouvez des bugs n'hésitez pas à me le faire savoir.
Merci

Benjamin

A voir également

Ajouter un commentaire Commentaires
Messages postés
10
Date d'inscription
jeudi 25 février 2010
Statut
Membre
Dernière intervention
24 août 2012

Puis-je avoir ce code en VB.net?
Messages postés
3
Date d'inscription
mardi 8 novembre 2005
Statut
Membre
Dernière intervention
1 mai 2006

En fait ce code n'est que pour donner un exemple ... Si quelqu'un en a besoin le mieux est toujours de le coder lui-même ;)
Mais ce qui est à observer dans cette source c'est le fait d'utiliser un seul module de séparation pour les deux types de code (ISBN et ISSN) mais bon il est certain qu'il y aurait de meilleures façons.

Merci pour le commentaire ;)
P.S.: pour les caractères accentués, sur ma config ça fonctionne bien.
Messages postés
15
Date d'inscription
mardi 3 août 2004
Statut
Membre
Dernière intervention
3 janvier 2007

Hello,

Ce n'est pas dangereux d'utiliser des caractères accentués ???
Pour la portabilité, c'est foutu...

Sinon, c'est sûrement intéressant pour des gens qui ont besoin de valider ce genre de codes.

a+

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.