Nedir php xxx / xxx / xxx biçiminde bir 5-7 basamaklı bir sayı dönüştürmek için temiz yolu?

5 Cevap php

I 5, 6 ve 7 haneli sayılar setleri var. Onları 000/000/000 biçiminde görüntülenir gerekir. Yani, örneğin:

12345 000/012/345 olarak görüntülenir

ve

9876543 009/876/543 olarak görüntülenir

I know how to do this in a messy way, involving a series of if/else statements, vestrlen functions, but there has to be a cleaner way involving regex that Im not seeing.

5 Cevap

sprintf ve Modulo bir seçenektir

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

Tamam, insanlar eşyalarını dışarı atarak vardır, bu yüzden ben de!

number_format bu binlerce ayırıcı kabul ettiğinden, harika olurdu, ama sprintf ve benzeri gibi dolgu sıfır yapmaz. Yani burada ben bir astar için geldi ne:

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

PhiLho önerisine Küçük iyileştirme:

Sen regex değiştirerek substr önleyebilirsiniz:

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

Verildiğinde, 5, bu her zaman çalışmak için en az 9 basamak 6 veya 7 haneli numara (söz belirtildiği gibi) sahip olacak, çünkü ben de ilk iki yakalama gruplarının her birinden sonra ? kaldırıldı ile. Eğer küçük bir giriş numarası alma ihtimaline karşı korumak istiyorsanız, bunun yerine '000000000' . $number karşı regex çalıştırın.

Alternatif olarak, kullanabilirsiniz

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

ve, o zaman bunu yapmak için en hızlı yolu (Regexes çalıştırmak veya bölünme yapmak gerek) olabilir şüpheli substr_replace ile uygun yerlerde, adresinde eğik kesikler, ama bu sadece anlamsız optimizasyonu içine almak gerçekten sunulan çözümlerin herhangi olarak hala sunucuya bir ağ bağlantısı kurmak çok daha hızlı olacaktır.

This would be how I would write it if using 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;

}

: Ile test

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

döner:

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

Geri-taşıdık 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;

}

İşte ben (üzgünüm ben de PHP bilmiyorum) Python bunu yapardım nasıl. Ben bunu dönüştürebilirsiniz eminim.

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])

This just pads the number to have length 9, then splits the substrings. That being said, it seems the modulo answer is a bit better.