Вопрос

Что мне нужно уметь делать, так это форматировать данные в переменной, вот так:

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

Проблема в том, что мне нужно иметь возможность изменять формат, поэтому статическое решение не будет работать.Мне также нравится иметь возможность изменять размер переменной, например:

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

Все идеи приветствуются!Спасибо за вашу помощь!

Примечание:Все переменные будут числами

Редактировать Я должен был четко указать формат, в котором не всегда будет группироваться по 3, и в нем может быть больше "-" в качестве символа группы будут непостоянными 1-22-333-4444, они будут группироваться только по 1-5

Это было полезно?

Решение

Ваш лучший выбор - это preg_replace предыдущее место.

К регулярным выражениям требуется некоторое привыкание, но это, вероятно, ваш лучший выбор...

Редактировать:

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

Ключ в том, чтобы сделать каждый набор, за исключением самого правого, нежадным, что позволит использовать шаблон, ориентированный по правой стороне.

Другие советы

Если входные данные, которые вы форматируете, всегда являются целым числом, вы можете попробовать number_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

Вы могли бы реализовать шаблон стратегии и и имеют новые классы форматирования, которые можно заменять во время выполнения.Это выглядит сложным, если вы не видели его раньше, но это действительно помогает с ремонтопригодностью и позволяет вам переключать форматер с помощью setFormatter() в любое время.

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

Тогда у вас был бы свой класс форматирования, который был бы примерно таким:

class NumberFormatter implements Formatter
{

   protected $_formatter = null;

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

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

Тогда вы могли бы использовать это следующим образом:

 $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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top