【问题标题】:formatting data in php在php中格式化数据
【发布时间】:2009-05-23 22:27:08
【问题描述】:

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

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

问题是我需要能够更改格式,所以静态解决方案行不通。我还希望能够更改变量大小,例如:

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

注意:所有变量都是数字

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

【问题讨论】:

  • 将下面的示例更新为 4 个部分...

标签: php formatting variables string-formatting


【解决方案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);

关键是让每个集合,除了最右边的一个非贪婪,允许面向右侧的模式匹配。

【讨论】:

  • 有没有办法在不知道位置的情况下设置模式?
  • @scott,不确定你的意思?您可以在没有结束字符串标记 $/ 的情况下进行模式匹配...我建议您阅读一些有关使用正则表达式的内容...
  • 阅读您的更新...您可以将他包装到一个函数中,其中传入模式、格式和输入字符串,并返回结果...
【解决方案2】:

如果您要格式化的输入始终是一个整数,您可以尝试 number_format 和 format as money (thousands etc..) 这是一个采用任何字符串并将其转换为所需格式的解决方案:

$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

【讨论】:

  • 如果它可以有一个以上的组大小,这将非常有用。
【解决方案3】:

您可以实现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

【讨论】:

  • 我之前尝试过这种类型的东西,但是每个块需要超过一组,我使用的是 php5。
  • 不要以为我明白你说的每块一组是什么意思
  • 格式化程序可以像 Tracker1 的解决方案一样从 preg_replace 返回结果,但是你可以有多个格式化程序来处理不同的事情。
  • 您的脚本输出类似于 123-45678910 但我需要能够输出更多组,例如 12-345-67-8910
  • 然后您可以修改生成它的算法形式,我正在演示一种您可以轻松更改算法的方法。由您决定算法的作用。对于那种格式,你需要 substr($input,0,2).'-'.substr($input,2,3).'-'.substr($input,5,2).'-'.substr( $输入,7);但是有更好的方法来生成这个输出(preg_replace)
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 2014-07-19
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多