2009-05-23 11 views
0

Was ich brauche, können Sie sein sind Formatdaten in einer Variablen, etwa so:Formatierung von Daten in PHP

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

Das Problem ist, ich brauche das Format ändern kann, so eine statische Lösung wouldn‘ t arbeiten. Ich mag auch der Lage sein, die variable Größe zu ändern, wie:

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

Alle Ideen sind willkommen! Danke für Ihre Hilfe!

Hinweis: Alle Variablen werden Zahlen

bearbeiten ich auf das Format klar gewesen sein sollte seine nicht immer gehen zu Gruppierung von 3, und es kann mehr haben, dann „-“ als Symbol , die Gruppen sind unbeständig 1-22-333-4444 es wird nur in der Gruppierung von 1-5 sein

+0

das folgende Beispiel auf 4 Abschnitte aktualisiert ... – Tracker1

Antwort

1

Ihre beste Wette ist preg_replace.

Reguläre Ausdrücke etwas gewöhnungsbedürftig, aber das ist wahrscheinlich die beste Wahl ...

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); 

Der Schlüssel ist, jeden Satz zu machen, außer dem righ-most ein nicht-gieriger, der eine rechtsseitige Mustererkennung zulässt.

+0

Gibt es eine Möglichkeit, ein Patten zu setzen, ohne die Positionen zu kennen? – Scott

+0

@scott, nicht sicher, was du meinst? Sie können eine Musterübereinstimmung ohne den Endstringmarker '$ /' machen ... Ich würde vorschlagen, etwas über die Verwendung von regulären Ausdrücken zu lesen ... – Tracker1

+0

Ihre Updates lesen ... Sie könnten ihn in eine Funktion einpacken, wo das Muster, format und eingang string übergeben, und die ergebnisse zurückgegeben ... – Tracker1

0

Sie konnten die strategy pattern implementieren und und neue Formatierungsklassen haben, die während der Laufzeit swappable sind. Es sieht kompliziert aus, wenn Sie es vorher nicht gesehen haben, aber es hilft wirklich bei der Wartbarkeit und ermöglicht es Ihnen, den Formatierer jederzeit mit setFormatter() zu wechseln.

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); 
    } 
} 

Dann würden Sie Ihre Formatierungsklasse haben, die wie so wäre:

class NumberFormatter implements Formatter 
{ 

    protected $_formatter = null; 

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

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

Dann könnten Sie es wie folgt verwendet werden:

$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

Ich probierte diese Art von Sache vor, aber es braucht mehr als eine Gruppe pro Block, ich benutze php5. – Scott

+0

Denkt nicht, ich verstehe, was Sie von einer Gruppe pro Block bedeuten – xenon

+0

Die Formatter können Ergebnisse aus einer preg_replace wie Tracker1 Lösung zurück, sondern u mehrere Formatierer für verschiedene Dinge haben kann. – xenon

0

Wenn die Eingabe Sie die Formatierung werden immer eine ganze Zahl können Sie number_format und Format wie Geld versuchen (tausende etc ..) Hier ist eine Lösung, die eine beliebige Zeichenfolge nimmt und wandelt es in das gewünschte Format:

$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

Das würde gut funktionieren, wenn es mehr als eine Gruppengröße haben könnte. – Scott