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

VBScript Discussion :

Regexp : Récupération d'un nombre entiers avec espace séparateur de milliers


Sujet :

VBScript

  1. #21
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Et maintenant le pire du pire....

    Je suis sûr que tu va m'envoyer balader parce que c'est infaisable mais peut être auras tu une idée ou deux qui permettraient de me faciliter la vie : c'est une sorte de concaténation de tout ce que je t'ai demandé jusqu'à présent en pire.

    J'ai un ou plusieurs montants que je dois rechercher dans le texte d'origine. Cependant je ne sais pas ,dans quel format ces montant sont écris : je sais juste qu'ils ont obligatoirement deux décimales mais ne connais ni le séparateur décimal ni celui des milliers si il y en a un (donc 6 possibilités d'écritures par montant : 1 2345.50 ou 1,234.50 ou 1234.50 ou 1 234,50 ou 1.234,50 ou 1234,50)

    Et ce n'est pas tout malheureusement : ces montants peuvent figurer dans
    la chaine d'origine à 5 euros près, c'est à dire que si je cherche 1234.50, je dois accepter tout nombre compris entre 1229.50 et 1239.50.

    ça fait 6.000 recherches par montant !

    Pouvez vous m'aider ?
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  2. #22
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    Je suis sûr que tu va m'envoyer balader parce que c'est infaisable mais peut être auras tu une idée ou deux qui permettraient de me faciliter la vie
    bonne approche psychologique que de titiller le sens du challenge de ton interlocuteur mais je suis trop vieux pour marcher à ça. quoique...
    plutôt que de te refiler d'office le pattern qui va bien, il serait bien que tu apprennes à définir tranquillement tes contraintes
    tu as commencé mais il faut poursuivre l'analyse :
    les six possibilités se divisent en (4 + 2) - 3 et 2 groupes de chiffres
    ensuite le 1er "séparateur" ne peut prendre que 3 valeurs : espace, point ou vrigule
    le 2ème "séparateur" les valeurs point ou virgule

    le test de l'arrondi à 5 euros se fera ensuite à partir d'une "référence arrière"
    yapluka
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #23
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Je reste persuadé que c'est infaisable.

    j'ai tout de même réussi à écrire cela, dans le cas ou je recherche le montant 12345.67 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set regEx = New RegExp
    regEx.Pattern = ""(12)( |.|,){0,1}(345)(,|.)(67)""
    regEx.IgnoreCase = False
    regEx.Global = True
    Set Matches = regEx.Execute(" 123456.78 ")
    For Each Match in Matches   'Itère la collection Matches.  
      Result=Match.Value
      MsgBox Result & "   " & Len(Result)
    Next
    Cela ne me satisfait pas pleinement parce que ce que je récupére jcontrient des , des . ou même un 0 inadéquat.

    Mais le but est de trouver une chaine et pas de l'extraire

    Merci
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  4. #24
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    De plus, si j'ai bien compris, les références arrières permettent de rechercher un élément déjà trouvé.

    par exemple s'assurer que si on a ([0-9]+)XX([0-9]+) avec les 2 nombres identiques...

    Et là... je ne vois vraiment pas comment ça peut m'aider ...
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  5. #25
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    j'ai bien une autre solution même si elle me demande du boulot supplémentaire ensuite : elle consiste à considérer que je peux avoir n'importe quoi sur les 4 derniers chiffres donc le pattern devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (12)( |.|,){0,1}(3)([0-9]{2})(,|.)([0-9]{2})
    Ce qui me renvoie des nombres en trop par rapport à mes 5 euros de marge. a moi de tester ce qui revient

    Mais bon je suis sur que tu as mieux ^^


    Merci

    PS : Non c'est nul comme solution 5000 - 5 = 4995 plus de 2 chiffres
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  6. #26
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Bonjour

    En plus je viens de me rendre compte que "(12)( |.|,){0,1}(345)(,|.)(67)" me validait 123345.67 ce qui ne me va pas du tout donc...

    Il faut que j'utilise : "(12)( |\.|,){0,1}(345)(,|\.)(67)" et là ça marche

    Mais je n'ai toujours pas de solution pour mes bornes.

    Pouvez vous m'aider

    Merci
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  7. #27
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    il y a 2 stratégies pour ce genre de problème
    - soit définir un pattern générique et effectuer la recherche précise sur les membres de la collection Matches
    - soit définir un pattern personnalisé directement
    la 1ère solution peut être + efficace si le générique "ramène" une collection de taille raisonnable par rapport à la source des données
    la 2ème impose une définition de pattern un peu...laborieuse
    comme tu t'orientais vers cette solution, voici la réponse...
    je n'ai pas géré les arrondis des bornes, faut pas pousser quand même
    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
    Dim alValue(5),ahValue(5)
    iValue=1236
    hValue = iValue + 5
    lValue= iValue - 5
    sValue=CStr(Int(lValue))
    p = 1
    For i = 7 - Len(sValue) to 6
      alValue(i-1)=Mid(sValue,p,1)
      p = p + 1
    Next
    sValue=CStr(Int(hValue))
    p = 1
    For i= 7 - Len(sValue) to 6
      ahValue(i-1)=Mid(sValue,p,1)
      p = p + 1
    Next
     
    Set regEx = New RegExp
    regEx.Pattern = "(" & alValue(0) & alValue(1) & alValue(2) & "|" & ahValue(0) & ahValue(1) & ahValue(2) & ")*" & "(\.|,| )?" & _
                    "(" & alValue(3) & alValue(4) & "[" & alValue(5) & "-9]|" & ahValue(3) & ahValue(4) & "[0-" & ahValue(5) & "])+" & "(\.|,)(\d+)"
     
    regEx.IgnoreCase = False
    regEx.Global = True
    Set Matches = regEx.Execute("7874585 xx 102.3 az 115.4 cd 12345.90 rtft 581,234.21 ou 1.231,74 qa 1234.50 ou 1 234,50 ou 1.234,50 ou 1234,50 rper 521,24 aa 2,55")
    For Each Match in Matches   'Itère la collection Matches. 
      Result=regEx.Replace(Match.Value,"$1$3")
      MsgBox Result
    Next
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  8. #28
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Ah j'ai honte.

    Comment j'ai pu pensé a enlever 5 a un chiffre alors que je n'ai même pas envisagé de l'enlever à la partie du nombre.


    Je te remercie je vais essayer ça.
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  9. #29
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Eh bien... le pire c'est que ça marche...

    Je ne pensais vraiment pas çà faisable.

    Je te félicite et je te remercie beaucoup.

    J'avais envisagé ta première solution, pour l'instant je ne peux l'appliquer a cause de raisons autres, il me fallait donc travailler sur cette deuxième.

    Je te remercie encore pour le temps passé et pour m'avoir fait découvrir la puissance des expressions régulières que je ne soupçonnais même pas.

    Cordialement
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Implémentation d'une division entre nombres entiers avec une précision arbitraire
    Par i.Polo dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 28/05/2015, 10h51
  2. [PowerShell] Récupération nom de fichier/repertoire avec espace
    Par joziel dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 16/12/2010, 10h03
  3. Trier des nombres entiers avec emu8086
    Par killerbee dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 20/03/2010, 00h29
  4. Réponses: 2
    Dernier message: 10/09/2007, 19h43
  5. Formater un nombre avec des séparateurs de milliers
    Par lagotonio dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/02/2007, 19h23

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