cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 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és3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 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és9Date d'inscriptionsamedi 22 décembre 2001StatutMembreDernière intervention10 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és3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 24 févr. 2010 à 18:38
Regroupe tes deux sources en une avec comme titre par exemple "conversion nombres -> packed numbers"
25 févr. 2010 à 18:13
Y'a pas photo, ma solution est la plus courte (mais il vaudrait mieux vérifier si elle fonctionne complètement)
25 févr. 2010 à 09:16
++
25 févr. 2010 à 09:09
"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
24 févr. 2010 à 22:22
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
24 févr. 2010 à 21:35
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
24 févr. 2010 à 20:18
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...
24 févr. 2010 à 18:38
Dans ton code, remplace :
#Case 0
#last = "}"
Par ceci :
#Case 0 : last = "}"
(idem pour les autres Case)