2010-10-11 8 views
2

J'ai besoin d'aide pour écrire une expression régulière en PHP. Je ne suis pas assez ami pour bien faire les choses. J'ai besoin de trouver tous les entiers dans une chaîne et les formater comme suit:Numéros de format Php dans une chaîne avec regexp

1 to 001000 
0.13 to 000130 
100 to 0100000 

et ainsi de suite. En langage normal cela signifie - éditer le numéro avec des zéros ou le modifier pour qu'il soit dans le même "ordre". Le point est d'avoir tous les entiers il la chaîne dans ce format (6 chiffres). Quelqu'un peut-il m'aider, s'il vous plaît? Je ne vais pas poster mes essais ici parce qu'ils sont trop bête :-)

+0

Votre exemple a '7' chiffres. – codaddict

+1

Pourrait-il y avoir des nombres négatifs? Si oui, que devrait-il se passer avec eux? Pourrait-il y avoir des nombres décimaux sans zéro comme '.13'? –

+0

Non à tous. Il ne peut y avoir que des valeurs positives avec des zéros en tête. Je reçois l'entrée du fichier XML qui contient uniquement les valeurs 13 ou 20 ou 186.578962453. J'ai besoin de dépouiller les valeurs et de faire exactement 6 chiffres. Il sera envoyé à des fins de recherche. – Bery

Répondre

1

En utilisant le 'e' modificateur sur preg_replace() (ou en utilisant preg_replace_callback()) vous pouvez utiliser answer de @ codaddict:

function my_format($d) { 
    return sprintf('%06d', round($d * 1000)); 
} 

$your_string = '0.12 100 number 1.12 something'; 

preg_replace('/\d+(\.\d+)?/e', 'my_format(\\0)', $your_string); 
// Should give '000120 100000 number 001120 something' 
+0

@codaddict Droit. Je devrais avoir copié-collé votre code à la place :) – jensgram

+0

Merci les gars pour les réponses rapides. Je vais essayer et vous faire savoir :-) – Bery

+0

J'ai essayé la solution proposée - il devrait y avoir * rond ($ d ... *.) Sauf si je devine quelque chose de mal - je dois changer TOUTES les valeurs numériques, y compris 1.12 dans l'exemple de @ jengram Et aussi quand je l'ai testé - il enlève l'espace après le nombre Ce dont j'ai besoin est de laisser le reste de la chaîne intacte Le but de ce code est de traiter la requête Zend Lucene afin de pouvoir recherche des nombres à virgule flottante .... :-) Je sais que je suis ... en train de ... iriser: -D – Bery

2

De vos exemples semble que vous multipliez le nombre avec 1000 et les préfixant avec 0 « s pour faire un total de 6 chiffres. Si cela est vrai, vous pouvez simplement faire:

sprintf("%06d",$n*1000); 
+0

Il ne se multiplie pas exactement. Je dois avoir tous les numéros pour avoir exactement la même longueur. La plage est "000.000" à "999.999". Et pour chaque nombre dans la chaîne d'entrée, j'ai besoin d'une sortie qui ressemble à "xxxxxx". Exactement six chiffres (avec des zéros supplémentaires) sans un point. – Bery