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

  1. #1
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 380
    Points : 858
    Points
    858
    Par défaut comment formater un numéro de téléphone ? c-a-d insérer un caractère tous les X caractères dans une chaine.
    bonjour,

    je cherche un truc tout bête en python et plutôt que de faire un découpage itératif de chaine, je me demande si ya pas une fonction/méthode dans python (string) pour le faire?

    en entrée j'ai un numéro de téléphone 0616453620
    en sortie je veux 06-16-45-36-20

    Techniquement parlant j'ai besoin d'inséré un caractère (le tiret) tous les 2 caractères dans une chaine de caractère.

    comment faire ?

  2. #2
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Bonjour,

    Je suppose que tes numéros sont tous au format français en 06... ou 05... etc.

    Tu peux donc imaginer une chose très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    strInput = "0600000000"
    i = 0
    j = 2
    strOutput = ""
    while i < len(strInput):
    	if i<len(strInput)-2:
    		strOutput = strOutput + strInput[i:j]+"-"
    	else:
    		strOutput = strOutput + strInput[i:j]
    	i = i + 2
    	j = j + 2
    J'espère que le numéro que tu as mis en exemple n'est pas le tien
    Hope it helps!
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Il faut regarder la doc de la fonction join, c'est celle que tu cherches. Maintenant il y a sûrement moyen de faire plus élégant et plus compréhensible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def getFormated(phonestring):
        items = [phonestring[x:x+2] for x in range(len(phonestring) / 2)]
        return '-'.join(items)
     
    print getFormated("0616453620")
    A+

    Pfeuh

  4. #4
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Je dois avouer que cette notation me fait mal aux yeux... Mais c'est efficace.
    Bon, Michaël, tu as le choix maintenant
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  5. #5
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 380
    Points : 858
    Points
    858
    Par défaut
    ces 2 solutions sont itératives...
    je pensais qu'il y avait une fonction intégré, genre le contraire de MATCH. ou un reg ...

    ps : non ce n'est plus mon numéro de mobile

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Points : 34
    Points
    34
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f = '{0}{1}-{2}{3}-{4}{5}-{6}{7}-{8}{9}'
    ch = '0616453620'
    print(f.format(*ch))

  7. #7
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Sinon, il y a ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> tel="0616453620"
    >>> 
    >>> '-'.join(map(lambda i:tel[i:i+2],range(0,len(tel),2)))
    '06-16-45-36-20'
    ou ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> '-'.join(map(lambda u:''.join(u),zip(tel[::2],tel[1::2])))
    '06-16-45-36-20'
    Couplé avec une fonction lambda, on peut l'utiliser à plusieurs reprises sans avoir à tout réécrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> formatel = lambda tel:'-'.join(map(lambda i:tel[i:i+2],range(0,len(tel),2)))
    >>>
    >>> formatel("0616453620")
    '06-16-45-36-20'
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour ma part, dans ce cas, je préfère comme denis2 les instructions de formatage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    t = "0616453620"
     
    print "%s%s-%s%s-%s%s-%s%s-%s%s" % tuple(t)
    06-16-45-36-20
     
    # Python 2.6
    print "{0}{1}-{2}{3}-{4}{5}-{6}{7}-{8}{9}".format(*t)
    06-16-45-36-20
     
    # Python >=2.7
    print "{}{}-{}{}-{}{}-{}{}-{}{}".format(*t)
    06-16-45-36-20
    L'avantage étant qu'on peut s'adapter à d'autres formats de n° de téléphones sur lesquelles les méthodes de boucles auront du mal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    t = "+33616453620"
     
    if t[0]=="+":
        print "%s%s%s-%s-%s%s-%s%s-%s%s-%s%s" % tuple(t)
     
        # Python 2.6
        print "{0}{1}{2}-{3}-{4}{5}-{6}{7}-{8}{9}-{10}{11}".format(*t)
     
        # Python >=2.7
        print "{}{}{}-{}-{}{}-{}{}-{}{}-{}{}".format(*t)
    Les 3 solutions donnant:

    [EDIT] On peut même fabriquer une petite fonction permettant de s'adapter facilement à n'importe quel format de numéro de téléphone:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    frmtel = lambda tel, modele: modele.replace('+','%s').replace('9','%s') % tuple(tel)
     
    tel = "0616453620"
    print frmtel(tel, "99-99-99-99-99")
    06-16-45-36-20
     
    tel = "+33616453620"
    print frmtel(tel, "+99-9-99-99-99-99")
    +33-6-16-45-36-20
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Oui mais ... non !

    Ca peut sembler plus finaud mais c'est parce qu'on s'en tient aux seuls numéros de téléphone (et qu'on peut se permettre d'écrire une dizaine de fois des {}).

    L'insertion automatique d'un caractère (ici le tiret '-') se résoud en construisant en dur une chaine de format où l'on met ... des tirets entre les {} ou les %s. Bref, on déplace le problème : ce n'est plus dans la chaine elle-même qu'on fait des paquets de X caractères séparés par des tirets mais dans une chaine de longueur double, avec des '{}', et des tirets tous les 2*X caractères !

    Si on veut (aussi) résoudre le cas général donné dans le titre du post (insérer un caractère tous les X caractères), mis à part le cas trivial où X vaut 1, je ne pense pas qu'on puisse (raisonnablement) passer cette méthode.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 046
    Points : 1 376
    Points
    1 376
    Par défaut
    +1

    ça revient à insérer des numéros dans une chaîne de tirets ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> tel = "0123456789"
    >>> out = ''
    >>> for e,n in enumerate(tel): out+=n+('-'if e&1 else '')
    ... 
    >>> out[:-1]
    '01-23-45-67-89'
    ou un oneline

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> tel = "0123456789"
    >>> ''.join([n+('-'if e&1 else '')for e,n in enumerate(tel)])[:-1]
    '01-23-45-67-89'

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour plxpy,

    Je trouve que toutes les solutions basées sur des boucles nécessitent des numéros de téléphone avec des nombres pairs de chiffres, ce qui est une contrainte.

    La solution que je propose résout simplement le problème posé tout en permettant de traiter si nécessaire d'autres formats de numéros de téléphones.

    Mais ce n'est pas un problème: laissons le posteur Michael REMY choisir!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  12. #12
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    ...solutions basées sur des boucles nécessitent des numéros de téléphone avec des nombres pairs de chiffres, ce qui est une contrainte
    Dans mes premiers exemples, j'avais effectivement mis en dur un '2' parce que je répondais brutalement aux cas des nos de téléphone mais ce genre de méthode s'affranchit complètement de la taille des paquets qu'on souhaite avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> buf = "12345678901234567890"
    >>> 
    >>> step = 7
    >>> ''.join(map(lambda (i,c):'%s%s'%('-' if i and not i % step else '',c),enumerate(buf)))
    '1234567-8901234-567890'
    >>> 
    >>> step = 5
    >>> ''.join(map(lambda (i,c):'%s%s'%('-' if i and not i % step else '',c),enumerate(buf)))
    '12345-67890-12345-67890'
    >>> 
    >>> step = 12
    >>> ''.join(map(lambda (i,c):'%s%s'%('-' if i and not i % step else '',c),enumerate(buf)))
    '123456789012-34567890'
    Ce que je voulais souligner c'est que, pour ne pas mettre "à la main" des tirets tous les 2 caractères, devoir écrire, à la main "{}{}-{}{}-{}{}-{}{}-{}{}" .... bof
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  13. #13
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Et bien voila un sujet bien propice pour démontrer la souplesse de Python

    Pour ce qui est de l'exemple donné
    en entrée j'ai un numéro de téléphone 0616453620
    en sortie je veux 06-16-45-36-20
    l'utilisation de .format() me semble aussi plus simple*.
    Par contre c'est vrais que c'est rigide...
    Les solutions avec .join() sembles plus adaptées, si 'elles restent maintenables' (ne pas sortir trop de pythoneries).

    @+

    *)
    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
    import sys
     
    class writable():
        def write(*args):
            pass
        def flush():
            pass
     
    old_out = sys.stdout
    sys.stdout = writable()
    from this import s
    sys.stdout = old_out
     
    d = {}
    for c in (65, 97):
        for i in range(26):
            d[chr(i+c)] = chr((i+13) % 26 + c)
    print("".join([d.get(c, c) for c in s.split('\n')[4]]))
    Merci d'utiliser le forum pour les questions techniques.

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Ok, mais je préfère tout de même ma solution parce que je serai encore capable de la comprendre du 1er coup d’œil dans 6 mois...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 380
    Points : 858
    Points
    858
    Par défaut
    whooo !
    merci à tous des propositions ! je me disais bien qu'on pouvait le faire ne python en une ou deux lignes sans itération (pas visible en tout cas, va savoir après ce que fait le compilateur derriere...).

    je vais choisir la solution qui permet juste de placer un tiret tous les deux caractères (qq soit le nombre de numéros, qq soit si c'est des chiffres ou pas)

    remerci !

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Points : 34
    Points
    34
    Par défaut
    bonjour à tous,

    je sais que ce poste devrais être mis en résolut mais j'en profite pour vous poser cette question,
    pourquois le principe que vous utilisez pour .join
    vous refusez de l'appliquer sur .format ?
    ou est-ce que ça coince ?

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    plxpy = lambda tel:'-'.join(map(lambda i:tel[i:i+2],range(0,len(tel),2)))  
     
    vft = lambda x : ((('{}{}-') * ((len(x) // 2) - 1)) + '{}{}').format(*x)
    en terme de temps ça semble plus rapide.

  17. #17
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    pourquois le principe que vous utilisez pour .join
    vous refusez de l'appliquer sur .format ?
    ??? Quelle vilaine pensée !

    Où ai-je écrit cela ? La solution proposée était autrement différente ! Elle consistait à écrire, en dur, le format ! Là, ce n'est vraiment pas le cas ! Tu transfères, comme je l'ai dit, le problème de la chaine à traiter au format d'affichage.

    J'en profite, par contre, pour dire que la solution proposée par Tyrtamos permet, effectivement, de "tuner" efficacement l'affichage d'un numéro de téléphone.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  18. #18
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 784
    Points : 7 043
    Points
    7 043
    Par défaut
    Je vais apporter ma contrib même si le temps me manque beaucoup, c'est plus fort que moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '-'.join([tel[i:i+2] for i in range(0, len(tel), 2)])
    Toujours aussi tordu tes onliners Josmiley

    Edit : Je viens de me rendre compte que c'est la même que pfeuh
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Salut à tous

    Je vois qu'on s'éclate en Python ici. J'ai beaucoup aimé l'ensemble des solutions et des remarques associées mais particulièrement celle de plxpy qui s'affranchit de beaucoup de contraintes comme "avoir un nombre de chiffre pair" ou "découper 2 par 2" ou "écrire en dur la chaine".

    Toutefois, puisque toute remarque constructive apporte à tous, je pense que la solution de plxpy sous-entend qu'on doit forcément découper la chaine sur "n" positions (n étant libre certes, mais unique). Donc on pourra découper sur 2 positions, ou sur 7 positions, ou sur 5 positions, mais on ne pourra pas découper sur 2 puis 5.

    J'offre donc une solution pour cette possibilité

    Code python : 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
    def fmt(chaine, step):
    	mod=0
    	i=0
    	ret=""
    	for x in chaine:
    		if i and not i % step[mod]:
    			ret+="-"
    			i=0
    			mod+=1
    			if mod == len(step): mod=0
    		# if
     
    		ret+=x
    		i+=1
    	# for
     
    	return ret
    # fmt()
     
    buf="abcdefghijklmnopqrstuvwxyz"
     
    print fmt(buf, (5, 3, 2, 6))  # => abcde-fgh-ij-klmnop-qrstu-vwx-yz
    print fmt(buf, (5, 4, 1))  # => abcde-fghi-j-klmno-pqrs-t-uvwxy-z

    Mon seul regret est d'avoir dû créer une fonction pour ça et de n'avoir pas réussi en passant par les list comprehension + lambda (pourtant je suis allé voir du coté des itertools mais sans trouver)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  20. #20
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si la somme des nombres de step était égale à la longueur de la chaine à formater, on pourrait écrire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fmtel = lambda buf, step: "-".join(["%s"*k  for k in step]) % tuple(buf)
     
    tel = "0616453620"
    print fmtel(tel, (2,2,2,2,2))
    06-16-45-36-20
     
    tel = "+33616453620"
    print fmtel(tel, (3,1,2,2,2,2))
    +33-6-16-45-36-20
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Formater un numéro de téléphone
    Par neuneu1 dans le forum Langage
    Réponses: 8
    Dernier message: 01/07/2012, 09h00
  2. Formater un numéro de téléphone belge
    Par Zarvox dans le forum Langage
    Réponses: 8
    Dernier message: 19/08/2010, 14h27
  3. Réponses: 6
    Dernier message: 06/07/2009, 14h19
  4. Formater un numéro de téléphone.
    Par maXrez dans le forum ASP.NET
    Réponses: 5
    Dernier message: 08/01/2008, 17h34
  5. [RegEx] Format de numéro de téléphone
    Par Heilong dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2007, 22h07

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