Domanda

Quello che ho bisogno di essere in grado fare è formattare i dati in una variabile, in questo modo:

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

Il problema è che ho bisogno di essere in grado di cambiare il formato, quindi una soluzione statica non avrebbe funzionato. Mi piace anche essere in grado di cambiare la dimensione variabile, come:

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

Tutte le idee sono benvenute! Grazie per l'aiuto!

Nota: Tutte le variabili saranno numeri

Modifica avrei dovuto essere chiari sul formato la sua non intenzione di essere sempre il raggruppamento di 3, e può avere più di "-" come simbolo, i gruppi sarà incostante 1-22 -333-4444 sarà solo nel raggruppamento di 1-5

È stato utile?

Soluzione

La cosa migliore è preg_replace .

Le espressioni regolari richiedere un certo tempo per abituarsi, ma questo è probabilmente la scelta migliore ...

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 chiave è quello di rendere ogni set, ad eccezione del righ-più uno non avido, consentendo un pattern match destra oriented.

Altri suggerimenti

Se l'ingresso si sta formattando è sempre un numero intero si può provare number_format e il formato come il denaro (migliaia, ecc ..) Ecco una soluzione che prende qualsiasi stringa e lo trasforma in formato desiderato:

$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

Si potrebbe attuare le href="http://en.wikipedia.org/wiki/Strategy_pattern" modello di strategia e ed avere nuove classi di formattazione che sono sostituibili a run tempo. Sembra complicato, se non avete visto prima, ma aiuta davvero con la manutenibilità e permette di passare il formattatore con la setFormatter () in qualsiasi momento.

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

Poi si dovrebbe avere la vostra classe di formattazione, che sarebbe in questo modo:

class NumberFormatter implements Formatter
{

   protected $_formatter = null;

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

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

Allora si potrebbe usare in questo modo:

 $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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top