/// <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> /// Retourne la référence de l'index donné<br/> /// En cas s'index négatif ou d'index trop grand une erreur est retournée<br/> /// (avant la validation retourne une erreur en cas se séquence nulle ou trop courte) /// </summary> /// <param name="nIndex">index à référencer : doit être positif ou egal à 0 </param> /// <returns></returns> public CResultAErreur GetReference(int nIndex) { CResultAErreur result = CResultAErreur.True; if (Romain) { try { string strRomain = CNombreRomain.RomainFromInt(nIndex); result.Data = strRomain; return(result); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); return(result); } } if (Sequence.Length == 0) { result.EmpileErreur(I.T("The sequence is empty|133")); } else if (Sequence.Length == 1) { result.EmpileErreur(I.T("The sequence must have a minimum of 2 characters|169")); } else if (nIndex < 0) { result.EmpileErreur(I.T("The index can't be negative|132")); } else { string strReference = ""; int nModulo = 0; if (nIndex == 0) { strReference = Sequence.Substring(0, 1); } while (nIndex != 0) { //Si la limite et la longueur sont précisés ça va dépasser if (this.LongueurReference != 0 && (strReference.Length == this.LongueurReference)) { result.EmpileErreur(I.T("This index is out of range|131")); nIndex = 0; } else { nModulo = nIndex % Base; strReference = Sequence.Substring(nModulo, 1) + strReference; nIndex = (nIndex - nModulo) / Base; } } if (result.Result && LongueurReference != 0) { int nDiff = LongueurReference - strReference.Length; for (int i = 0; i != nDiff; i++) { strReference = Sequence.Substring(0, 1) + strReference; } } result.Data = strReference.ToUpper(); } 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); }