CONVERSION D'UN NOMBRE EN "PACKED NUMBER", ET INVERSEMENT

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 24 févr. 2010 à 18:38
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 25 févr. 2010 à 18:13
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51342-conversion-d-un-nombre-en-packed-number-et-inversement

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
25 févr. 2010 à 18:13
On passe de 56 lignes de code (pas de commentaires ni de passages à la ligne inutiles) à 10 lignes de code.
Y'a pas photo, ma solution est la plus courte (mais il vaudrait mieux vérifier si elle fonctionne complètement)
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 févr. 2010 à 09:16
j'ai parlé un peu vite oui, le code est à optimiser comme l'indique ghuysmans99. reste à voir la taille qu'il prendra alors

++
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 févr. 2010 à 09:09
salut,
"Code from WebSeb's Code Snippets"
en effet limite "snippet" = à poster sur codyx.org

j'ai mis à jour pour fusionner tes 2 sources, un peu plus conséquent, ainsi ce code peut rester ici ;)

bonne continuation
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
24 févr. 2010 à 22:22
Oops, le code que j'ai posté n'est pas bon.
Voilà la correction :

Public Function PackNum(NumberToConvert As Double, EntirePositionsCount As Integer, DecimalPositionsCount As Integer) As String
Dim TmpVal As String, Last As String * 1
Dim TranslationTable As String: TranslationTable = "{ABCDEFGHI}JKLMNOPQR"
TmpVal = String(EntirePositionsCount + DecimalPositionsCount, "0") & Abs(Fix(NumberToConvert))
TmpVal = TmpVal & Right(Round(Abs(NumberToConvert) * Int("1" & String(DecimalPositionsCount, "0"))), DecimalPositionsCount)
TmpVal = Right(TmpVal, EntirePositionsCount + DecimalPositionsCount) If NumberToConvert < 0 Then Last Mid(TranslationTable, 10 + CInt(Right(TmpVal, 1)), 1) Else Last Mid(TranslationTable, CInt(Right(TmpVal, 1)), 1)
TmpVal = Mid(TmpVal, 1, EntirePositionsCount + DecimalPositionsCount - 1) & Last
PackNum = TmpVal
End Function
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
24 févr. 2010 à 21:35
Y'a vraiment moyen de faire plus court :

Option Explicit
Dim TranslationTable(19) As String * 1

Public Sub InitTable()
Dim i As Integer TranslationTable(0) "{": TranslationTable(10) "}" For i 1 To 9: TranslationTable(i) Chr(i + 64): Next i For i 11 To 19: TranslationTable(i) Chr(i + 63): Next i
End Sub

Public Function PackNum(NumberToConvert As Double, EntirePositionsCount As Integer, DecimalPositionsCount As Integer) As String
Dim TmpVal As String, Last As String * 1
TmpVal = String(EntirePositionsCount + DecimalPositionsCount, "0") & Abs(Fix(NumberToConvert))
TmpVal = TmpVal & Right(Round(Abs(NumberToConvert) * Int("1" & String(DecimalPositionsCount, "0"))), DecimalPositionsCount)
TmpVal = Right(TmpVal, EntirePositionsCount + DecimalPositionsCount) If NumberToConvert < 0 Then Last TranslationTable(10 + CInt(Right(TmpVal, 1))) Else Last TranslationTable(CInt(Right(TmpVal, 1)))
TmpVal = Mid(TmpVal, 1, EntirePositionsCount + DecimalPositionsCount - 1) & Last
Pack_Num = TmpVal
End Function
cs_WebSeb Messages postés 9 Date d'inscription samedi 22 décembre 2001 Statut Membre Dernière intervention 10 avril 2005
24 févr. 2010 à 20:18
Merci pour l'intérêt et les commentaires :-)

Droit de réponse :
- oui, éventuellement je pourrais fusionner mes 2 sources pour n'en faire qu'une, parlant des "packed numbers", sauf que ici, on peut voir le "sens" de la conversion
- pour les "case", je préfère la lisibilité et la ventilation des lignes. Ca prend plus de place mais je trouve ça plus clair et plus lisible... question de goût quoi...
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
24 févr. 2010 à 18:38
Regroupe tes deux sources en une avec comme titre par exemple "conversion nombres -> packed numbers"

Dans ton code, remplace :
#Case 0
#last = "}"

Par ceci :
#Case 0 : last = "}"

(idem pour les autres Case)
Rejoignez-nous