2010-08-18 6 views
3

J'ai besoin d'une regex qui correspondra sur un prix ou un montant.Expression régulière PHP pour correspondre au prix ou au montant

Il doit correspondre à ces

  • 410,00
  • 0,12

mais pas ces

  • 100,000
  • -600,00
  • .12
  • .1234

Cela fonctionne pour tous les cas ci-dessus à l'exception des valeurs uniques comme 1

/^[0-9]*\.?[0-9]{2}+$/ 

Comment puis-je régler si simples entiers correspondra? Et quelqu'un peut-il expliquer pourquoi l'actuel est faux?

Répondre

7

Je suggère une petite correction à l'expression régulière de Tom Revell puisque vous pouvez toujours entrer plusieurs 0 comme premiers chiffres. c'est-à-dire 00002.23 qui est probablement incorrect.

/^([1-9][0-9]*|0)(\.[0-9]{2})?$/ 
+0

Vous avez raison. Bonne prise! – hitfactory

+0

Cela fonctionne bien moi. Je vous remercie :) – Chinmay235

4

Faire la partie décimale en option:

/^[0-9]+(\.[0-9]{2})?$/ 
+0

Je viens de réaliser que vous avez répondu en premier. Merci! – hitfactory

2

L'expression régulière que vous avez entré correspondront les éléments suivants:

Tout chiffre, 0 fois ou plus, suivie, un point, 0 ou 1 fois, suivi de exactement 2 chiffres

L'expression régulière nécessitera donc toujours au moins 2 chiffres en raison du bit de fin.

Je vous suggère ce qui suit:

/^[0-9]+(\.[0-9]{2})?$/

qui correspondent à 1 ou plusieurs chiffres, éventuellement suivi d'un point et exactement 2 chiffres.

+0

Parfait. Merci, Tom! – hitfactory

+0

@kidrobot: vous devriez accepter la solution de Tom car elle a fonctionné pour vous – cam

1

Je pense que vous feriez mieux de laisser les expressions régulières hors du mixage.

Ce que je ferais est de convertir la valeur en int et arrondir la décimale, puis vérifier si elle est négative. Je voudrais également vérifier si le premier caractère est un signe dollar et, si oui, il suffit de l'enlever. Le code serait plus simple et plus lisible de cette façon, et si quelqu'un entrait 12.34512 ou .1, le système fonctionnerait toujours.

//untested 

$amount = "$0.12" 
if($amount && $amount[0] == '$') { 
    ltrim($amount, '$'); 
} 
$int_amount = (int) $amount; 
$int_amount = round($int_amount, 2); 
if($amount <= 0) { 
    //error 
} 

Cela étant dit, je ne sais pas si vous avez à utiliser regexp pour une raison quelconque (comme si vous avez une fonction de validation qui prend une valeur et regexp comme arguments), mais dans un cas comme Je pense que le fait d'être libéral dans le format des prix serait préférable pour ne pas dire aux utilisateurs qu'ils ont entré un «montant invalide» lorsqu'ils ont entré 12 cents sans zéro.

+0

Une autre fonction en bas de la ligne s'attend à ce que le montant soit le type affiché dans un magasin ou sur une étiquette de prix, donc 12.34512 ou .1 ne peut pas être autorisé. Mais oui, je m'interroge parfois sur l'efficacité de regex. – hitfactory

+0

ouais mais le code que j'ai posté devrait s'occuper de ça, je pense. 12.34512 deviendrait 12.34, et .2 deviendrait 0.2 (une fois converti en chaîne, peut-être pas implicitement, mais ce n'est pas difficile), bien que je puisse me tromper. Vous pouvez ajouter plus pour vous assurer qu'il y a un zéro à la fin, aussi, OMI, l'effort en vaut la peine pour éviter les utilisateurs confus. Mais en tout cas, il semble que vous ayez déjà une solution - je vais juste laisser ceci ici au cas où cela aiderait quelqu'un d'autre. –

0

La meilleure façon de trouver une expression régulière est de commencer par mettre l'idée sur papier. Essayez de dessiner votre regex ou de l'écrire dans un pseudo-code, testez-le dans votre tête et assurez-vous qu'il est correct avant de vous embourber dans la syntaxe regex de votre langage.

Questions connexes