/// <summary> /// Retourne l'index de la référence donnée<br/> /// Plusieurs erreurs potentielles peuvent être retournées :<br/> /// - la reference est vide<br/> /// - un ou plusieurs caractères n'existent pas dans la séquence<br/> /// - la longueur n'est pas adequate<br/> /// - l'index retourné est en dehort des limites du format de numérotation<br/> /// Avant validation :<br/> /// - la sequence est nulle<br/> /// - la séquence est trop courte<br/> /// </summary> /// <param name="strReference">Référence à indexer</param> /// <returns></returns> public CResultAErreur GetIndex(string strReference) { CResultAErreur result = CResultAErreur.True; if (Romain) { try { int nVal = CNombreRomain.IntFromRomain(strReference); nVal = Math.Max(nVal, 0); result.Data = nVal; return(result); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); return(result); } } //Verification de la reference donnée result = VerifierNormalisation(strReference); if (result.Result) { int nIndex = 0; int nCpt = strReference.Length - 1; char[] lstChars = strReference.ToUpper().ToCharArray(); string strSequenceUp = Sequence.ToUpper(); foreach (char c in lstChars) { int nPosDansSec = strSequenceUp.IndexOf(c); if (nPosDansSec == -1) { result.EmpileErreur(I.T("The char '@1' is not in the sequence", c.ToString())); return(result); } double nTmp = (double)nIndex; nTmp += (double)nPosDansSec * Math.Pow((double)Base, (double)nCpt); if (nTmp > (double)int.MaxValue) { result.EmpileErreur(I.T("Reference out of range|128"), c.ToString()); break; } else { nIndex = (int)nTmp; } nCpt--; } result.Data = nIndex; } return(result); }
/// <summary> /// Permet la vérification d'une référence sur sa normalisation /// </summary> /// <param name="strReferenceAVerifier">Reference à vérifier</param> /// <returns></returns> public CResultAErreur VerifierNormalisation(string strReferenceAVerifier) { CResultAErreur result = CResultAErreur.True; if (Romain) { try { CNombreRomain.IntFromRomain(strReferenceAVerifier); return(result); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } } strReferenceAVerifier = strReferenceAVerifier.Trim().ToUpper(); //Pas de séquence déterminée if (this.Sequence.Length == 0) { result.EmpileErreur(I.T("The sequence is empty|133")); } //Sequence trop courte else if (this.Sequence.Length == 1) { result.EmpileErreur(I.T("The sequence must have a minimum of 2 characters|169")); } //Valeur Nulle else if (strReferenceAVerifier == "" || strReferenceAVerifier == string.Empty) { result.EmpileErreur(I.T("Reference of @1 cannot be null|134", this.Libelle), this.LongueurReference.ToString()); } //Trop longue else if ((LongueurReference != 0) && strReferenceAVerifier.Length > LongueurReference) { result.EmpileErreur(I.T("Reference must have @1 character length|130"), this.LongueurReference.ToString()); } else { //Reformatage si nécessaire (Longueur spécifiée) if (LongueurReference != 0) { int nDiff = LongueurReference - strReferenceAVerifier.Length; for (int i = 0; i != nDiff; i++) { strReferenceAVerifier = Sequence.Substring(0, 1) + strReferenceAVerifier; } } //Caractère inexistant dans la séquence string strSequenceUp = Sequence.ToUpper(); foreach (char c in strReferenceAVerifier.ToCharArray()) { if (strSequenceUp.IndexOf(c) == -1) { result.EmpileErreur(I.T("Character @1 does not exist in the sequence (@2)|129"), c.ToString(), Sequence); } } result.Data = strReferenceAVerifier; } return(result); }