我需要能够做的是格式数据中的变量,像这样:

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