How to find last 8 digit of number 0000548795846 - php

I want to find last 8 digit of number 0000548795846 in php.
Its done fine when I use string but I have some problem with Integer starts with zero.

Try with -
substr(" 0000548795846", -1, 8);

In your example what is happening is that, PHP by default considers the number starting with 0 (zero) as octal number i.e base 8, and you are expecting it as decimal.
When PHP comes across any number starting with zero it converts it into decimal equivalent of the actual number for ex. 0000548795846 gets converted into 44 decimal, so there is no length >= 8 present.
So, Solution is to convert the number in string format. Then use substr() with appropriate arguments, as suggsted by "sgt"

Related

PHP (int) generates wrong number

I am working on a PHP-script that handles monetairy amounts, and therefore needs to be exact with 2 decimals. To do this, I convert the user-input to a number by multiplying it with 100, and then casting it to int. This works fine, untill I recently discovered a number that increases by 1 when cast to int.
the malfunctioning code:
$number = (int)(str_replace(',','.',$_POST["input"])*100);
The number that gives problems is 2509,22 (I live in the Netherlands, so we use comma's for decimals, hence the str_replace in the above line of code).
This value creates the integer $number 250921, which is obviously 1 too low.
I know that int has limits, but this number is well within those limits as far as I'm aware...
When you multiply the string by 100 you get a float and its representation is not always what you expect, in this case 250921.99999999997. See it with:
echo serialize(str_replace(',','.','2509,22')*100);
Then you cast to an integer which trucates the fraction to get 250921. See Is floating point math broken?.
The solution would be to remove the comma and use as is and optionally cast to an integer:
$number = (int)str_replace(',', '', '2509,22');
For the issue of users entering too many fractional numbers, you should either use two inputs, one for whole number and one for fraction and/or restrict/validate that the inputs are correctly formatted. However, you can format the number first:
echo $number = (number_format(str_replace(',', '.', '2509,22'), 2, '.', '')*100);
You can use regex to match the int and zero - two decimals.
This will not do any conversions and nothing is multiplied or casted.
It will be treated as a string and nothing changes but the number of decimals.
$input = "2509,2222222";
// Regex number comma number (zero - two)
Preg_match("/(\d+),*(\d{0,2})/", $input, $m);
Unset($m[0]); // remove full match
Echo implode("", $m); // implode parts
https://3v4l.org/MjcYV

How is Leading Zero working in php?

Let's suppose I have a code which outputs $i as
$i = 016;
echo $i / 2;
//ans will be 7
I know that the leading zero indicates an octal number in PHP, but how is it interpreted, how can it be executed? Can somebody share its execution step by step? What is the role of parser here? I have researched a lot and read all the previous answers but none are having any deep explanation.
When you preceed integers with zero in PHP, in that instance, 029.
It becomes octal.
So when you echo that, it will convert to its decimal form.
Which results to:
echo 016; //14 (decimal) valid octal
echo 029; // 2 (decimal) - Invalid octal
Actually, its here stated in the manual
Valid octal:
octal : 0[0-7]+
Note: Prior to PHP 7, if an invalid digit was given in an octal integer (i.e. 8 or 9), the rest of the number was ignored. Since PHP 7, a parse error is emitted.
The octal numeral system, or oct for short, is the base-8 number system, and uses the digits 0 to 7.
Octal numerals can be made from binary numerals by grouping consecutive binary digits into groups of three (starting from the right).
For example, the binary representation for decimal 74 is 1001010. Two zeroes can be added at the left: (00)1 001 010, corresponding the octal digits 1 1 2, yielding the octal representation 112.
In your question $i = 016; is calculated by the interpreter and produces $i = 14;(which is the equilevant decimal number)
Then you simply divide it by 2, which outputs 7.

Comparing number sizes for numbers that start with 0?

I am trying to compare numbers against each other in terms of size and pick the closest (largest) value.
For example i have the array of numbers: 0541, 0555, 0789.
And a number: 0547.
In this case 0555 would be my desired number.
My code works for all numbers not starting with a 0, but with the above example it fails.
Any ideas?
EDIT: Should have made it clear, not all numbers start with a 0, and the number to be compared is the time so is it still possible to remove the zero from that?
If you have a number that starts with a 0 it will be compared as a string. Turn the numbers into integers before comparing using intval (http://php.net/manual/en/function.intval.php)

int variable with leading zero?

Why is it that following results in 34?
It doesn't seem to have anything to do with octal numbers.
intval(042);
but a leading 0 does indicate octal in many languages, as is the case here.
It does have to do with octal numbers, 042 is interpreted as the octal number 42 which is 4 * 8 + 2 = 34.
Please be aware that the octal interpretation happens when the number literal is parsed while loading the PHP script. It has nothing to do with intval(), which doesn't do anything here because the value is already integer.
Octal interpretation happens only with number literals, not when casting a string to integer:
intval(042) // == 34
intval('042') // == 42
(int)'042' // == 42
In PHP a number with leading 0 is read as an octal number.
So 042 is read as an octal number.
The intval() function converts it into decimal number, which is 34.
So the browser output is 34.
It's simply how the function is defined. The leading zero is an instruction parse it as an octal number, similarly as to how 0x as a prefix means hex. See the documentation for more information.
Be careful when passing this function a string value with a leading "0". If you give it "042" then, it will treat it as BASE 8 - 9 and convert it to decimal value, which is by default base.
Please go through this

printf type specifier

I now want to know that means this line:
printf("Answer: %00010.6f", 22);
He prints: 022.000000. But way? i know whar 6f means float.
thansk for answers
After initially thinking this was C (result of long habit), I realize this is for PHP. Mostly the same, but the constant seems to be handled differently.
Anyway, the parameters in your code break down as follows:
f = print the number as a floating point
10 = total field width of ten digits
000 = print up to 3 leading zeros when applicable (i.e. if there aren't 3 significant figures left of the decimal point)
. = use a dot as the decimal separator
6 = six places after the decimal
It seems the printing parameters for PHP's printf are actually on the sprintf page.
The printf() syntax and meanings are very well-documented. Look at the printf(3) man page or the Wikipedia printf entry.
The particular example you gave means: print a floating point number. Give it 6 characters after the decimal point. Then prefix it with zeros until it is at least 10 characters.
this format string means:
use 0 as filling character
fill to a minimum of 3 characters before the . ( 2 -> 002, 23 -> 023, longer numbers stay as they are)
display exactly 10 characters (including the delimiter)
use . as decimal delimiter
display 6 digits after the delimiter
type float
printf("Answer: %f", 22) would enter the number 22 to the string "Answer: %f" in the place of the "%f" and print it as a float ("f" is for "float").
The numbers between the "%" and the "f" are to set the format - the number of digits that the printout will have.

Categories