什么是在PHP中将5-7位数字转换为xxx / xxx / xxx格式的最简洁方法?

时间:2008-10-27 05:49:33

标签: php regex

我有5位,6位和7位数字。我需要它们以000/000/000格式显示。例如:

12345将显示为000/012/345

9876543将显示为009/876/543

我知道如何以杂乱的方式执行此操作,涉及一系列if / else语句和strlen函数,但必须有一种更清晰的方式涉及我没有看到的正则表达式。

7 个答案:

答案 0 :(得分:16)

sprintf和modulo是一个选项

function formatMyNumber($num)
{
    return sprintf('%03d/%03d/%03d',
                   $num / 1000000,
                  ($num / 1000) % 1000,
                   $num % 1000);
}

答案 1 :(得分:5)

$padded = str_pad($number, 9, '0', STR_PAD_LEFT);
$split = str_split($padded, 3);
$formatted = implode('/', $split);

答案 2 :(得分:3)

你问了一个正则表达式解决方案,我喜欢和他们一起玩,所以这是一个正则表达式的解决方案! 我只是出于教育(和娱乐)目的展示它,只需使用Adam的解决方案,干净,可读和快速。

function FormatWithSlashes($number)
{
    return substr(preg_replace('/(\d{3})?(\d{3})?(\d{3})$/', '$1/$2/$3',
            '0000' . $number),
            -11, 11);
}

$numbers = Array(12345, 345678, 9876543);
foreach ($numbers as $val)
{
    $r = FormatWithSlashes($val);
    echo "<p>$r</p>";
}

答案 3 :(得分:1)

好的,人们都在扔东西,所以我也会这样做!

number_format会很棒,因为它接受千位分隔符,但它不会像sprintf之类那样执行填充零。所以这就是我想出的单线:

function fmt($x) {
    return substr(number_format($x+1000000000, 0, ".", "/"), 2);
}

答案 4 :(得分:1)

PhiLho的建议略有改进:

您可以通过将正则表达式更改为:

来避免 substr
function FormatWithSlashes($number)
{
    return preg_replace('/^0*(\d{3})(\d{3})(\d{3})$/', '$1/$2/$3',
            '0000' . $number);
}

我还删除了前两个捕获组中的每一个之后的,因为当给出5,6或7位数字时(如问题中所指定的),这将始终至少使用9位数。如果您想要防止接收较小输入数字的可能性,请对'000000000'运行正则表达式。 $ number 而不是。

或者,您可以使用

substr('0000' . $number, -9, 9);

然后使用 substr_replace 在适当的位置拼接斜杠,我怀疑这可能是执行此操作的最快方法(无需运行正则表达式或进行除法),但这真的只是得到了进入无意义的优化,因为所提出的任何解决方案仍然比建立与服务器的网络连接快得多。

答案 5 :(得分:1)

如果使用Perl 5.10

,这就是我写的方式
use 5.010;

sub myformat(_;$){

  # prepend with zeros
  my $_ = 0 x ( 9-length($_[0]) ) . $_[0];

  my $join = $_[1] // '/'; # using the 'defined or' operator `//`

  # m// in a list context returns ($1,$2,$3,...)
  join $join, m/ ^ (\d{3}) (\d{3}) (\d{3}) $ /x;

}

经过测试:

$_ = 11111;
say myformat;
say myformat(2222);
say myformat(33333,';');
say $_;

返回:

000/011/111
000/002/222
000;033;333
11111

后移到Perl 5.8

sub myformat(;$$){
  local $_ = @_ ? $_[0] : $_

  # prepend with zeros
  $_ = 0 x ( 9-length($_) ) . $_;

  my $join = defined($_[1]) ? $_[1] :'/';

  # m// in a list context returns ($1,$2,$3,...)
  join $join, m/ ^ (\d{3}) (\d{3}) (\d{3}) $ /x;

}

答案 6 :(得分:0)

以下是我在python中的表现(对不起,我也不懂PHP)。我相信你可以转换它。

def convert(num): #num is an integer
    a = str(num)
    s = "0"*(9-len(a)) + a
    return "%s/%s/%s" % (s[:3], s[3:6], s[6:9])

这只是填充长度为9的数字,然后分割子串。 话虽这么说,似乎模数的答案要好一些。