1

I'm trying to build a php function and discovered some weird behavior and I can't even formulate a proper question, so if anyone can explain what is going on, I would appreciate it.

I'm working with a set of numbers with leading zeros, and its important that they be maintained, but users almost never input leading zeros. So I use this:

$x = 123;
$n = 5;
$x = str_pad((int)$x,$n,"0",STR_PAD_LEFT);
echo $x;

and, as desired, this gets me 00123.

The weird stuff happens when I tested for a user inputting a zero before their number

$x = 0123;
$n = 5;
$x = str_pad((int)$x,$n,"0",STR_PAD_LEFT);
echo $x;

This returns 00083. Same thing happens if a user were to input 00123.

That result has me completely bewildered. Thanks in advance for any explanation of what's going on here.

Kerrek SB
  • 464,522
  • 92
  • 875
  • 1,084
lcHatter
  • 120
  • 9

1 Answers1

5

Integer literals starting with 0 are interpreted base 8. Your second $x has the value 83. See the manual on integers for details.

The intval() function lets you specify the base if you're reading a user string.

If we're talking about literals, in PHP the literal 0 is decimal, while in C and C++ it is octal. It's the little differences that make life fun.

Community
  • 1
  • 1
Kerrek SB
  • 464,522
  • 92
  • 875
  • 1,084
  • I'll look into keeping user input base 10. Now I know what to research, thanks a ton! – lcHatter Sep 01 '11 at 20:11
  • Well, the [`intval()`](http://php.net/manual/en/function.intval.php) function lets you specify the base if you're reading a user string. I was just talking about literals. – Kerrek SB Sep 01 '11 at 20:13