2009-05-23 4 views
0

Ce que je dois pouvoir faire est des données de format dans une variable, comme suit:données formating en php

format: xxx-xxx variable: 123456 output: 123-456 

Le problème est que je dois être en mesure de changer le format, donc une solution wouldn statique » t travail. J'aime aussi pouvoir changer la taille variable, comme:

format: xxx-xxx variable: 1234 output: 1-234 

Toutes les idées sont les bienvenues! Merci de votre aide!

Note: Toutes les variables seront des nombres

Modifier Je suis clair sur le format de son ne va pas être le regroupement de 3 toujours, et il peut avoir plus « - » comme un symbole , les groupes seront inconstants 1-22-333-4444 il sera seulement en groupe de 1-5

+0

a mis à jour l'exemple ci-dessous à 4 sections ... – Tracker1

Répondre

1

Votre meilleur pari est preg_replace.

Les expressions régulières prennent un certain temps pour s'y habituer, mais cela est probablement votre meilleur pari ...

EDIT:

//initial parsing 
$val = preg_replace(
    '/(\d*?)(\d{1,2}?)(\d{1,3}?)(\d{1,4})$/', 
    '${1}-${2}-$[3}-${4}', 
    $inputString 
); 

//nuke leading dashes 
$val - preg_replace('^\-+', '', $val); 

La clé est de faire tous ensemble, à l'exception de la Righ-plus un non-gourmand, permettant une correspondance de motif orientée vers la droite.

+0

Existe-t-il un moyen de définir un patten sans connaître les positions? – Scott

+0

@scott, vous ne savez pas ce que vous voulez dire? Vous pouvez faire une correspondance de motif sans le marqueur de fin de chaîne '$ /' ... je suggérerais quelques lectures sur l'utilisation des expressions régulières ... – Tracker1

+0

lisez vos mises à jour ... vous pourriez envelopper son dans une fonction où le motif, format, et la chaîne d'entrée sont passés, et les résultats sont retournés ... – Tracker1

0

Vous pouvez implémenter le strategy pattern et disposer de nouvelles classes de mise en forme qui peuvent être remplacées lors de l'exécution. Cela a l'air compliqué si vous ne l'avez pas vu auparavant, mais cela aide vraiment à la maintenabilité et vous permet de changer le formateur avec setFormatter() à tout moment.

class StyleOne_Formatter implements Formatter 
{ 
    public function format($text) 
    { 
     return substr($text,0,3).'-'.substr($text,3); 
    } 
} 

class StyleTwo_Formatter implements Formatter 
{ 
    public function format($text) 
    { 
     return substr($text,0,1).'-'.substr($text,1); 
    } 
} 

Ensuite, vous auriez votre classe de mise en forme qui serait comme si:

class NumberFormatter implements Formatter 
{ 

    protected $_formatter = null; 

    public function setFormatter(Formatter $formatter) 
    { 
     $this->_formatter = $formatter; 
    } 

    public function format($text) 
    { 
    return $this->_formatter->format($text); 
    } 
} 

Ensuite, vous pouvez l'utiliser comme ceci:

$text = "12345678910"; 
$formatter = new NumberFormatter(); 

$formatter->setFormatter(new StyleOne_Formatter()); 
print $formatter->format($text); 
// Outputs 123-45678910 

$formatter->setFormatter(new StyleTwo_Formatter()); 
print $formatter->format($text); 
// Outputs 1-2345678910 
+0

J'ai essayé ce type de chose auparavant, mais il faut plus d'un groupe par bloc, j'utilise php5. – Scott

+0

Ne pensez pas que je comprends ce que vous entendez par un groupe par bloc – xenon

+0

Les formateurs peuvent renvoyer des résultats à partir d'un preg_replace comme la solution de Tracker1 mais vous pouvez avoir plusieurs formateurs pour différentes choses. – xenon

0

Si l'entrée vous formatez est toujours un nombre entier vous pouvez essayer number_format et formater comme l'argent (les milliers etc.) Voici une solution qui prend n'importe quelle chaîne et la transforme dans votre format désiré:

$split_position = 3; 
$my_string  = ''; 
echo strrev(implode('-',(str_split(strrev($my_string),$split_position)))); 

input: 1234;  output: 1-234 
input: abcdefab; output: ab-cde-fab 
input: 1234567 output: 1-234-567 
+0

Cela fonctionnerait bien s'il pouvait avoir plus d'une taille de groupe. – Scott

Questions connexes