Какой самый простой способ преобразовать 5-7-значное число в формат xxx / xxx / xxx в php? - PullRequest
4 голосов
/ 27 октября 2008

У меня есть наборы из 5, 6 и 7 цифр. Мне нужно, чтобы они отображались в формате 000/000/000. Так, например:

12345 будет отображаться как 000/012/345

и

9876543 будет отображаться как 009/876/543

Я знаю, как сделать это беспорядочно, включая ряд операторов if / else и функции strlen, но должен быть более чистый способ с использованием регулярных выражений, которых я не вижу.

Ответы [ 7 ]

16 голосов
/ 27 октября 2008

sprintf и modulo - это одна опция

function formatMyNumber($num)
{
    return sprintf('%03d/%03d/%03d',
                   $num / 1000000,
                  ($num / 1000) % 1000,
                   $num % 1000);
}
5 голосов
/ 27 октября 2008
$padded = str_pad($number, 9, '0', STR_PAD_LEFT);
$split = str_split($padded, 3);
$formatted = implode('/', $split);
3 голосов
/ 27 октября 2008

Вы попросили найти решение для регулярных выражений, и мне нравится играть с ними, поэтому вот решение для регулярных выражений!
Я показываю это только для образовательных (и забавных) целей, просто используйте решение Адама, чистое, читаемое и быстрое.

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>";
}
1 голос
/ 28 октября 2008

Я бы так написал, если бы использовал 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;

}
1 голос
/ 27 октября 2008

Незначительное улучшение по предложению 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 , который, я подозреваю, может быть самым быстрым способом сделать это (не нужно запускать регулярные выражения или делить), но на самом деле это просто получение бессмысленная оптимизация, так как любое из представленных решений будет намного быстрее, чем установление сетевого соединения с сервером.

1 голос
/ 27 октября 2008

ОК, люди выбрасывают вещи, и я тоже!

number_format было бы здорово, потому что он принимает разделитель тысяч, но он не выполняет заполнение нулями, такими как sprintf и тому подобное. Итак, вот что я придумал для однострочника:

function fmt($x) {
    return substr(number_format($x+1000000000, 0, ".", "/"), 2);
}
0 голосов
/ 27 октября 2008

Вот как я это сделаю на 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, а затем разбивает подстроки. При этом кажется, что ответ по модулю немного лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...