带前导零,连字符和限制的格式编号

时间:2015-12-07 10:37:32

标签: php regex printf

我想用以下规则格式化给定字符串;

  • 只获取数字
  • 让他们分成4位数组
  • 每个小组必须领先于0
  • 必须有3组。

鉴于:1234预期结果:0000-0000-1234

鉴于:123预期结果:0000-0000-0123

鉴于:12345预期结果:0000-0001-2345

鉴于:123456789012345预期结果:1234-5678-9012

无论如何要实现这一目标而不为其创建方法/功能?例如使用正则表达式和/或使用sprintf

3 个答案:

答案 0 :(得分:4)

使用str_pad()格式化全部为零的字符串,chunk_split()为每4个字符添加-substr()负责限制字符串的长度为14个字符,在最后一个示例中,字符串有16个字符,substr()修复此问题。

$arr = ['1234', '123', '12345', '123456789012345'];

foreach($arr as $item){
   $str = str_pad($item, 12, '0',STR_PAD_LEFT);
   echo   substr(chunk_split($str, 4, '-'), 0, 14) .'<br>';
}

输出:

0000-0000-1234
0000-0000-0123
0000-0001-2345
1234-5678-9012

答案 1 :(得分:2)

只需使用sprintf格式化字符串,将其拆分然后内爆!

<?php
$no_arr = ['1234', '123', '12345', '123456789012345'];

foreach($no_arr as $n){
    $formatted_number = str_split(sprintf("%012d", $n), 4);
    echo substr(implode("-", $formatted_number), 0, 14) .'<br>';
}

输出将是:

0000-0000-1234
0000-0000-0123
0000-0001-2345
1234-5678-9012

说明:

$twelve_digit = sprintf("%012d", $n);
$split_into_4 = str_split($twelve_digit, 4);
$add_hyphen = implode("-", $split_into_4);
$remove_trailing_chars = substr($add_hyphen, 0, 14);
echo $remove_trailing_chars ." <br/>";

一个班轮:

echo substr(implode("-", str_split(sprintf("%012d", $n), 4)), 0, 14);

答案 2 :(得分:1)

您可以使用vsprintf,这是一种更简单的方法

<?php
$no_arr = ['1234', '123', '12345', '123456789012345'];

foreach($no_arr as $n){
    echo vsprintf("%04d-%04d-%04d",str_split(sprintf("%012d", $n), 4))."<br/>";
}

输出将是:

0000-0000-1234
0000-0000-0123
0000-0001-2345
1234-5678-9012