expression régulière et décimales

Invité
Invité n'ayant pas de compte PHPfrance

12 mai 2009, 16:42

Bonjour à tous,
j'ai des valeur décimales dans une chaine sous la forme:
0.52
1.27
15.00
35.01

Je vous drais avec une expression régulière, touver toutes les valeurs décimales et leur ajouter le signe € juste derrière, de manière à obtenir:
0.52 €
1.27 €
15.00 €
35.01 €

J'ai tenté le code suivant:
preg_replace('#^([0-9])+\.([0-9])+$#', '$1 €', $description);
Il en se passe rien...quelqu'un voit-il ce qu je fais mal?
Merci pour vos réponses.

Invité
Invité n'ayant pas de compte PHPfrance

12 mai 2009, 17:16

ok, il me manquait les parenthèses pour créer une variable $1 avec la valeur recherchée.

Ceci fonctionne presque bien:
preg_replace('#([0-9][0-9].[0-9][0-9])#', '$1 €', $description);
ça me transforme 15.26 en 15.26 €.
Mon problème: l'expression régulière ne transforme pas les décimales de la forme:
1.25
ou
1.1
25.6

car il n'y a pas deux chiffres de chaque côté du point...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 mai 2009, 17:16

L'expression est la suivante:
// Modifier la description en ajoutant € après un nombre décimal
$description = preg_replace('#^(\d*[.,]?\d*)$#', '$1 €', $description);
Le nombre décimal est de la forme : (\d*[.,]?\d*)
\d désigne un chiffre de 0 à 9
et * désigne N répétitions de chiffres.
Donc la forme \d* désigne un nombre constitué de N chiffres

et finalement [.,] est mise entre deux nombre et signifie un séparateur de décimaux pouvant être le . (point) ou la , (virgule)
On a ajouté un ? après, pour signifier que ce séparateur est facultatif et ainsi traiter aussi les nombre qui n'ont pas de partie décimale.
Modifié en dernier par sadeq le 12 mai 2009, 17:27, modifié 2 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

12 mai 2009, 17:18

ach, on a du poster en meme temps. c'est paaarfait merci beaucoup!

Invité
Invité n'ayant pas de compte PHPfrance

12 mai 2009, 17:32

petite question: comment intégrer une prise en compote des entiens dans ta solution, en plus des décimales pour dire "trouver tous les entiers ou toutes les décimales"

Invité
Invité n'ayant pas de compte PHPfrance

12 mai 2009, 17:37

pardon, entiers ET décimales pas OU

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 mai 2009, 18:31

On a ajouté un ? après, pour signifier que ce séparateur est facultatif et ainsi traiter aussi les nombre qui n'ont pas de partie décimale.
:-*
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

12 mai 2009, 19:25

merci! j'ai un autre pb.
j'ai une liste comme d'éléments comme ceci:

voiture(opel): 2000
soutien-gorge(90B):
vélo(rouge): 3
avion(f11):

je voudrais remplacer a jouter 0 € après : s'il ny a rien. dans mon exemple, ça revient à faire un pattern qui remplace

soutien-gorge(90B):
par
soutien-gorge(90B): 0€

et

avion(f11):
par
avion(f11): 0€

pour cela j'ai tenté ceci:
 preg_replace('#(\):[^0-9a-z])$#', '$1 0 €', $description);
tout ça pour dire: "si tu trouves ) suivi de : et que juste après il n'y a pas de caractères alphanumériques, ajoute 0 € à la suite.

ça ne marche pas, mais pas d'erreur. voyez vous pourquoi?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 mai 2009, 20:31

Tu fais:
preg_replace('#(.*:)\s*$#', '$1 0 €', $description); 
le filtre (.*:)$ cherche le texte qui se termine forcement par : (deux-points) plus ou moins suivis d'espaces et donc, où il n'y a pas de données après les : (deux-points)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

12 mai 2009, 20:58

ça n'a pas marché cette fois. exemple concret:
je dois transformer:

Total photos numériques(0,90€/photo):

en

Total photos numériques(0,90€/photo): 0 €

Aucune erreur mais pas de résultat non plus

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 mai 2009, 21:23

Désolé, je ne poste jamais sans tester, et ceci marche:
<?php
$description = "Total photos numériques(0,90€/photo):";
echo preg_replace('#(.*:)\s*$#', '$1 0 €', $description); 
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

13 mai 2009, 00:42

ya til un caractère pour désigner "rien" dans une expression régulière?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 mai 2009, 08:56

Oui: ^(.{0})$ ça veut dire rien car elle cherche {0} fois un caractère quelconque désigné par (.)
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène