Conclusion: Marc B’s solution is a 64 Bit, but for 32 Bit I’m not sure you can get the accuracy needed
UPDATE #1: 19 character length is the string/number max length
UPDATE #2: This kinda works but only if the number is in string format like this:
$number = "12345678901234567890";
if I pass it like this
$number = 12345678901234567890;
I get an warning:
Warning: gmp_abs(): Unable to convert variable to GMP – wrong type
Updated Class
class StringToInteger {
public static function getInteger($number) {
//return sprintf('%.0f', $number);
//$number = sprintf('%d', $number);
$number = gmp_abs($number);
return gmp_strval($number);
}
}
ORIGINAL QUESTION BELOW:
I have some data being passed either as a string or integer (Think Phone Number but longer), most of the data is just a long number like this:
1234567890123456789
But sometimes it comes like this
123-456-789-012-345-678-9 // could be other non numeric characters as well
Using the below functions doesn’t give the desired results
class StringToInteger {
public static function getInteger($number) {
return number_format($number, 0, '.', '');
}
}
class NumericOnly {
public static function formatNumber($number) {
return preg_replace("/[^\d]/", "", $number);
}
}
Pass as numeric:
$number = 1234567890123456789;
// output: 1.23456789012E+18 can't use this
echo "Number: {$number}\n";
// Where did my number go? truncated/rounded?
// output: 12345678901218 can't use this
echo "Numeric Only: ".NumericOnly::formatNumber($number)."\n";
// Where did my number go? truncated?
// output: 1234567890123456768 can't use this
echo "String To Integer: ".StringToInteger::getInteger($number)."\n";
Pass as string:
$string = '1234567890123456789';
// output: 1234567890123456789
echo "String Number: {$string}\n";
// Works
// output: 1234567890123456789
echo "String Numeric Only: ".NumericOnly::formatNumber($string)."\n";
// Where did my number go? truncated?
// output: 1234567890123456768 can't use this
echo "String To Integer: ".StringToInteger::getInteger($string)."\n";
// After Conversion, truncated?
// output: 1234567890123456768 can't use this
echo "After String To Integer: ";
echo StringToInteger::getInteger(NumericOnly::formatNumber($string))."\n";
Alpha Numeric
$string = '123-456-789-012-345-678-9';
// output: 123-456-789-012-345-678-9 can't use this
echo "String Number: {$string}\n";
// Works
// output: 1234567890123456789
echo "String Numeric Only: ".NumericOnly::formatNumber($string)."\n";
// After Conversion, truncated?
// output: 1234567890123456768 can't use this
echo "After String To Integer: ";
echo StringToInteger::getInteger(NumericOnly::formatNumber($string))."\n";
Any ideas on how to get a Long Integer (The full correct number)?
The largest integer that can be represented in a 64bit PHP install, compared to your number:
since you’re exceeding the maximum number size, you can’t expect to get useful results without using something like bcmath/GMP.