在php中将5-7位数字转换为xxx/xxx/xxx格式最干净的方法是什么


Whats the cleanest way to convert a 5-7 digit number into xxx/xxx/xxx format in php?

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

12345将显示为000/012/345

9876543将显示为009/876/543

我知道如何以一种混乱的方式来实现这一点,涉及一系列if/else语句和strlen函数,但必须有一种更干净的方式来涉及regex,这是我所没有看到的。

sprintf和modulo是的一个选项

function formatMyNumber($num)
{
    return sprintf('%03d/%03d/%03d',
                   $num / 1000000,
                  ($num / 1000) % 1000,
                   $num % 1000);
}
$padded = str_pad($number, 9, '0', STR_PAD_LEFT);
$split = str_split($padded, 3);
$formatted = implode('/', $split);

您要求一个regex解决方案,我喜欢玩它们,所以这里有一个regex解决方案
我展示它只是为了教育(和娱乐)目的,只是使用亚当的解决方案,干净、可读且快速。

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>";
}

好吧,人们都在扔东西,所以我也会!

number_format会很好,因为它接受千位分隔符,但它不像sprintf等那样填充零。以下是我为一条线路设计的:

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

PhiLho建议的小改进:

您可以通过将正则表达式更改为:来避免子字符串

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

我还删除了在前两个捕获组中的每个捕获组之后,因为当给定5、6或7位数字(如问题中所述)时,它将始终至少有9位数字可供使用。如果您想防止接收到较小输入数字的可能性,请针对"000000000"运行regex$数字

或者,您可以使用

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

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

如果使用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/111000/002/222000;033;33311111

后端口到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;
}

以下是我在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,然后拆分子字符串。话虽如此,模的答案似乎要好一点。