在PHP中格式化数据

时间:2009-05-23 22:27:09

标签: php formatting variables string-formatting

我需要做的是在变量中格式化数据,如下所示:

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

问题是我需要能够更改格式,因此静态解决方案不起作用。我也希望能够改变变量大小,如:

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

欢迎所有想法!谢谢你的帮助!

注意:所有变量都是数字

编辑我应该清楚格式,它不会总是3的分组,它可能有更多的“ - ”作为符号,组将是不定的1-22 -333-4444它只会在1-5的分组中

3 个答案:

答案 0 :(得分:1)

你最好的选择是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);

关键是制作每一组,除了最右边的一组非贪婪,允许右侧的模式匹配。

答案 1 :(得分:0)

您可以实现strategy pattern并且具有可在运行时交换的新格式化类。如果您之前没有看过它,它看起来很复杂,但它确实有助于可维护性,并允许您随时使用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

答案 2 :(得分:0)

如果你要格式化的输入总是一个整数,你可以尝试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