我有5位,6位和7位数字。我需要它们以000/000/000格式显示。例如:
12345将显示为000/012/345
和
9876543将显示为009/876/543
我知道如何以杂乱的方式执行此操作,涉及一系列if / else语句和strlen函数,但必须有一种更清晰的方式涉及我没有看到的正则表达式。
答案 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的建议略有改进:
您可以通过将正则表达式更改为:
来避免 substrfunction 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的数字,然后分割子串。 话虽这么说,似乎模数的答案要好一些。