IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP Discussion :

changer des nombres dans une chaine


Sujet :

ASP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut changer des nombres dans une chaine
    bonjour, j'ai un truc très précis, à faire en ASP:

    j'ai un système de fichier, dont les noms sont stockés dans une base de données, et comme je veux un historique, je ne change pas le nom d'un fichier, je le stocke avec un numéro de version qui est censé évoluer selon le temps:
    le nom relatif du fichier sera de cette forme:

    filename_vX.Y.extension

    pour changer ce nom dans le fichier, je procède de la manière suivante:
    -j'extrais l'extension puis la version, puis je récupère le nom
    -j'ai une chaine _vX.Y qui représente la version.
    X représente un numéro de version majeure, et Y un numéro de version mineure.
    au départ la version était représentée en réels dans ma base, mais quand je changeais le numéro en ajoutant +0,1 par exemple, cela engendrait à long terme des erreurs, et je me suis retrouvé avec une version 2,599999 après une version 2.5, et en plus, si je décide d'avoir 11 versions mineures avant de passer à la version majeure (ici avec 2 versions majeures déjà), je peux vouloir passer de la version 2.9 à la version 2.10, donc je ne peux pas gérer ça facilement avec les décimaux (parce que je ne sais pas combien de décimales j'aurais, et il faut gérer l'incrément)

    pour ne pas trop massacrer la base qui était déjà très lourde au moment où je suis arrivé à mon stage, j'ai juste fais passer la colonne de réel flottant à varchar.

    mais mon problème, c'est que les fonctions que j'ai faites pour remplacer l'incrément ne fonctionnent pas, et je n'ai aucun moyen d'avoir les résultats intermédiaires, car je fais des tests sur un serveur distant, et les tests ne peuvent que se limiter à un test d'intégration...

    je vous donne les fonctions dont je me sers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Function Extension(NomFichier)
      Dim n, varTemp
       varTemp=CStr(NomFichier)
       n=inStr(varTemp,".")
      Do
        If n=0 Then Exit Do
        varTemp=Right(varTemp, Len(varTemp)-n)
        n=inStr(varTemp,".")
      Loop
     Extension=CStr(Right(nomFichier,Len(varTemp)+1))
    End Function
     
     
    Function Version(NomFichierSE) ' On utilise le nom du fichier sans l'extension qui est déjà extraite
      Dim n, varTemp
       varTemp=CStr(NomFichierSE)
       n=inStr(varTemp,"v")
      Do
        If n=0 Then Exit Do
        varTemp=Right(varTemp,Len(varTemp)-n) 
        n=inStr(varTemp,"v")
      Loop
      Version=CStr(Right(NomFichierSE,Len(VarTemp)+2))
    End Function
     
    ' Pour vmin et vmax, on aura StrVersion de la forme _vX.Y
    ' vmin renverra Y et vmax renverra X
    Function vmin(StrVersion)
      Dim n
      Dim temp
       temp=CStr(StrVersion)
       n=inStr(temp,".")
      Do
        If n=0 Then Exit Do
        temp= Right(temp,Len(temp)-n)
        n=inStr(temp,".")
      Loop
      vmin=Cint(temp)
    End Function
     
    Function vmax(StrVersion)
      Dim temp
      Dim vmin
      vmin=vmin(StrVersion)
      temp=Left(StrVersion,Len(StrVersion)-Len(vmin)-1)
      vmax=Cint(Right(temp,Len(temp)-2))
    End Function
     
    Function UpGrade(strVersion, Importance)
    'On aura une chaine de type: _vXX.YY
      Dim vmin
      Dim vmax
      vmin=vmin(strVersion)
      vmax=vmax(strVersion)
     
      If Importance like "majeure" Then
             vmax=CStr(vmax+1) 
             vmin=CStr("0")
        Else vmin=CStr(vmin+1)
      End if
     
    UpGrade="_v"& vmax &"."& vmin
    End Function
    et l'appel est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vFichier_Ext = Extension(vFichier)  'On extrait l'extension, en comprenant le point
    vFichier_Name = Left(vFichier, Len(vFichier)-Len(vFichier_Ext))
    vFichier_Vers= Version(vFichier_Name) 'On extrait du reste la version du fichier, s'il y en a une, afin de pouvoir la changer
    vFichier_Name= Left(vFichier, Len(vFichier)-Len(vFichier_Vers)-Len(vFichier_Ext))   'On extrait le reste: le nom du fichier
    vNewVersionFichier=Upgrade(vFichier_Vers,"mineure")
    je sais que mes fonctions Extension et Version sont bonnes, car je les utilise dans une autre page (celle qui crée le fichier au départ, à la version 0.1), et les résultats sont bons

    l'erreur réside donc dans les fonctions vmin, vmax et upgrade, le problème est que j'ai appris l'ASP sur le tas en commençant mon stage, et que je me suis inspiré des codes sources de mon prédécesseur, donc il est probable que j'aurais pu faire mieux, mais je savais pas comment...

    maintenant que j'ai expliqué le contexte, voici ma question:

    quelqu'un pourrait-il me donner un moyen d'extraire d'une chaine du type "_vX.Y" X et Y étant des nombres inconnus bien sur, et de passer cette chaine à "_vX.(Y+1)" ou "_v(X+1).0"? ceci en ASP coté serveur svp

    merci d'avance pour vos réponses

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    en fait, je viens de m'apercevoir que je faisais passer mes variable de int à string de cette manière, je vais tester en enlevant les CStr que j'ai mises dans la fonction Upgrade, c'est peut etre ça qui m'a fait bugguer

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    en fait ça marche quand meme pas, donc j'ai besoin de votre aide, car là j'ai plus d'idée.

    HELP!!! PLEASE HELP!!!

  4. #4
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    Salut,

    En faisant ainsi, cela ne fonctionne toujours pas ?
    Code ASP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Function UpGrade(strVersion, Importance)
    'On aura une chaine de type: _vXX.YY
      Dim intMin
      Dim intMax
      intMin = vmin(strVersion)
      intMax = vmax(strVersion)
     
      If Importance = "majeure" Then
             intMax = intMax + 1 
             intMin = 0
        Else intMin = intMin + 1
      End if
     
    UpGrade = "_v" & intMax & "." & intMin 
    End Function
    Cordialement,
    Gil DERENNE
    DBA Oracle - MySQL - SQL Server - PostegreSQL
    Dev WebServices C#.NET

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    non, ça marche pas, je crois que je vais faire un truc bourrin sur les chaines (genre itératif), mais je pensais qu'il était possible de gérer plus facilement que ça (même en fortran c'est plus facile mon truc... )

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    j'ai fait une fonction bourrine, mais ça marche toujours pas, je comprend pas pourquoi, parce que là j'ai plus de conversion à faire, tout se passe en chaine de caractère

    voici les codes des 3 fonctions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    ' Pour vmin et vmax, on aura StrVersion de la forme _vX.Y
    ' vmin renverra Y et vmax renverra X
    Function vmin(StrVersion)
      Dim n
      Dim temp
       temp=CStr(StrVersion)
       n=inStr(temp,".")
      Do
        If n=0 Then Exit Do
        temp= Right(temp,Len(temp)-n)
        n=inStr(temp,".")
      Loop
      vmin=temp
    End Function
     
    Function vmax(StrVersion)
      Dim temp
      Dim vmin
      vmin=vmin(StrVersion)
      temp=Left(StrVersion,Len(StrVersion)-Len(vmin)-1)
      vmax=Right(temp,Len(temp)-2)
    End Function
     
    Function UpGrade(strVersion, Importance)
    'On aura une chaine de type: _vXX.YY
    Dim intmin,intmax,nbtemp,dernierchiffre,resultat
    intmin=vmin(strVersion)
    intmax=vmax(strVersion)
    resultat=""
    If Importance Like "majeure" Then
      nbtemp=CStr(vmax)
    Else
      nbtemp=CStr(vmin)
    End If
      Do
      dernierchiffre=Right(nbtemp,1) 'on prend le chiffre des unités
      nbtemp=Left(nbtemp,Len(nbtemp)-1) 'on prend le nombre de dizaines
      If dernierchiffre <>"9" Then Exit Do
      resultat="0" & resultat
      Loop
      'on sort avec dernierchiffre qui est soit un chiffre entre 0 et 8, soit un caractère vide qu'on prendra pour un 0 (= on met un "1" au début de la chaine résultat)
      Select Case dernierchiffre
    	 Case "0" Or "": resultat=nbtemp & "1" & resultat
    	 Case "1": resultat= nbtemp & "2" & resultat
    	 Case "2": resultat= nbtemp & "3" & resultat
    	 Case "3": resultat= nbtemp & "4" & resultat
    	 Case "4": resultat= nbtemp & "5" & resultat
    	 Case "5": resultat= nbtemp & "6" & resultat
    	 Case "6": resultat= nbtemp & "7" & resultat
    	 Case "7": resultat= nbtemp & "8" & resultat
    	 Case "8": resultat= nbtemp & "9" & resultat
      End Select
     
    If Importance Like "majeure" Then
      UpGrade = "_v" & resultat & ".0"
    Else UpGrade = "_v" & intmax & "." & resultat
    End If
     
    End Function
    je commence à me demander si c'est pas mes fonctions vmin et vmax qui bugguent

    je vais finir par criser si ça marche pas

  7. #7
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    Est-ce que vmin(chaine) et vmax(chaine) donnent bien un nombre comme résultat ?

    Si oui, ma fonction fonctionne...

    Si non, en effet, il y a un problème dans tes fonctions vmin et vmax.

    J'ai pas trop le temps de voir maintenant, je regarderais plus tard (sauf si un autre à déjà trouvé la solution avant moi
    Cordialement,
    Gil DERENNE
    DBA Oracle - MySQL - SQL Server - PostegreSQL
    Dev WebServices C#.NET

  8. #8
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    A y est...

    Voici le résultat (désolé, j'ai completement modifié ton travail, mais il y avait vraiement beaucoup de trucs que je ne comprenait pas...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function fnVMin(strVal)
      Dim intPosition
      intPosition = InStr(strVal, ".")
      fnVMin = CInt(Right(strVal, Len(strVal) - intPosition))
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function fnVMax(strVal)
      Dim intPosition
      intPosition = InStr(strVal, ".")
      fnVMax = Cint(Left(strVal, intPosition - 1))
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Function fnUpGrade(strVersion, Importance)
        Dim intMin, strMin
        Dim intMax, strMax
        intMin = fnVMin(strVersion)
        intMax = fnVMax(strVersion)
     
        If Importance = "majeure" Then
            intMax = intMax + 1 
            intMin = 0
        Else 
            intMin = intMin + 1
        End If
     
        If Len(CStr(intMin)) = 1 Then 
            strMin = "0" & CStr(intMin)
        Else
            strMin = CStr(intMin)
        End If
     
        strMax = CStr(intMax)
     
        'On aura une 'chaine' de type: _v(nX)X.YY
        fnUpGrade = "_v" & strMax & "." & strMin 
    End Function
    Pour faire fonctionner tout ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response.Write fnUpGrade("1.04", "mineure") ' Donne _v1.05
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response.Write fnUpGrade("1.04", "majeure") ' Donne _v2.00
    Cordialement,
    Gil DERENNE
    DBA Oracle - MySQL - SQL Server - PostegreSQL
    Dev WebServices C#.NET

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    ah bah merci, c'est super si ça marche, j'ai pas besoin que cela soit positionné automatiquement sur 2 chiffres, mais je vais tester tout ça

    merci bien

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    bon, c'est nickel, ça marche, c'est le bonheur ^^

    merci à gderenne, à developpez.net, à toute la communauté de développeurs, à ma maman, à mon poisson rouge...

    non en fait surtout à gderenne qui m'a pondu une super solution ^^

  11. #11
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    De rien... C'est bonheur

    N'hésite pas avec le bouton Resolu.
    Cordialement,
    Gil DERENNE
    DBA Oracle - MySQL - SQL Server - PostegreSQL
    Dev WebServices C#.NET

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 36
    Points : 22
    Points
    22
    Par défaut
    justement, j'allais le faire ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraire des nombres dans une chaine de caractère
    Par fxfxfx dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 27/05/2013, 10h41
  2. Récuperer un nombre dans une chaine de caractère
    Par ColonelHati dans le forum C
    Réponses: 4
    Dernier message: 27/04/2005, 14h50
  3. Réponses: 3
    Dernier message: 31/01/2005, 23h18
  4. [langage] compter des caracteres dans une chaine
    Par louisis dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 22h39
  5. [LG]Extraire des nombres d'une chaine
    Par audreym31 dans le forum Langage
    Réponses: 4
    Dernier message: 18/01/2004, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo