-2

I am trying to display numbers retrieved from the database, in a specific format in a text box. There are two ways in which the numbers can be displayed.

  • When the total numbers are 10 in database (4608061019) Expected output 46-0806-1019
  • When the total numbers are 13 in database (4608061019100) Expected output 46-0806-1019-100

My progress so far:

While saving the value into the database I am using preg_replace("/[^0-9]/","",$string); // to make sure all hardcoded "-" are removed while storing.

Cœur
  • 37,241
  • 25
  • 195
  • 267

4 Answers4

1

Easy! If you are sure that there are only these two options, then you can do this way:

  1. Convert the number to an array of numbers:

    $number = str_split($number);
    
  2. Check the length:

    if (count($number) == 10)
        $number = $number[0] . $number[1] . "-" . $number[2] . $number[3] . $number[4] . $number[5] . "-" . $number[6] . $number[7] . $number[8] . $number[9];
    else if (count($number) == 13)
        $number = $number[0] . $number[1] . "-" . $number[2] . $number[3] . $number[4] . $number[5] . "-" . $number[6] . $number[7] . $number[8] . $number[9] . "-" . $number[10] . $number[11] . $number[12];
    
  3. Return the number:

    return $number;
    

The full function here:

function tokenize($number)
{
    $number = str_split($number);
    if (count($number) == 10)
        $number = $number[0] . $number[1] . "-" . $number[2] . $number[3] . $number[4] . $number[5] . "-" . $number[6] . $number[7] . $number[8] . $number[9];
    else if (count($number) == 13)
        $number = $number[0] . $number[1] . "-" . $number[2] . $number[3] . $number[4] . $number[5] . "-" . $number[6] . $number[7] . $number[8] . $number[9] . "-" . $number[10] . $number[11] . $number[12];
    return $number;
}

Output

echo tokenize(4608061019);
echo tokenize(4608061019100);

Output

46-0806-1019
46-0806-1019-100

Fiddle: http://codepad.viper-7.com/EVWeFR

Praveen Kumar Purushothaman
  • 164,888
  • 24
  • 203
  • 252
1

One possible (regex-using) approach:

$str = '4608061019';
$formatted = preg_replace(
  '/(^\d{2}|\d{4})(?!$)/', '$1-', $str);
// 46-0806-1019

Demo. This function doesn't check the string's length - it just adds a hyphen after each relevant sequence of symbols (2 right after the beginning, 4 afterwards).

raina77ow
  • 103,633
  • 15
  • 192
  • 229
0

Another alternative solution:

$parts = array(2,4,4,3);
$string = "4608061019100";
$i = 0;
$newString = '';
foreach ($parts as $part) {
    $newString.=substr($string, $i, $part) ."-";
    $i = $i+$part;
}
$newString = rtrim($newString, "-");

Output is:

string '46-0806-1019-100' (length=16)

Works for 46-0806-1019 too.

vaso123
  • 12,347
  • 4
  • 34
  • 64
0

try it:

//$number = '4608061019';
$number = '4608061019100';



function formatImportantNumber($theNumber){
    $formatedNumber = '';
    if(strlen($theNumber)==10){
    //46-0806-1019
        $formatedNumber = substr($theNumber, 0, 2).'-'.substr($theNumber, 2, 4).'-'.substr($theNumber, 6, 4); 
    }elseif(strlen($theNumber)==13){
    //46-0806-1019-100
        $formatedNumber = substr($theNumber, 0, 2).'-'.substr($theNumber, 2, 4).'-'.substr($theNumber, 6, 4).'-'.substr($theNumber, 10, 3); 
    }else{
        die('Invalid number formated')
    }


    return $formatedNumber;
}

echo formatImportantNumber($number);