Форматировать целое число или строку в длинное целое число (без научных обозначений / усеченных / округленных чисел) - PullRequest
2 голосов
/ 03 ноября 2011

Вывод: Решение Марка Б - 64-битное, но для 32-битного я не уверен, что вы можете получить необходимую точность

ОБНОВЛЕНИЕ № 1: Длина 19 символов - это максимальная длина строки / числа

ОБНОВЛЕНИЕ № 2: Это работает, но только если число в строковом формате, например:

$number = "12345678901234567890";

если я передам это следующим образом

$number = 12345678901234567890;

Я получу предупреждение:

Предупреждение: gmp_abs (): невозможно преобразовать переменную в GMP - неправильный тип

Обновлен класс

class StringToInteger {
    public static function getInteger($number) {
        //return sprintf('%.0f', $number);
    //$number = sprintf('%d', $number);
    $number = gmp_abs($number);
    return gmp_strval($number);
    }
}

ОРИГИНАЛЬНЫЙ ВОПРОС НИЖЕ:

У меня есть некоторые данные, переданные в виде строки или целого числа (думаю, номер телефона, но длиннее),большая часть данных - это просто длинное число, подобное этому:

1234567890123456789

Но иногда это происходит так:

123-456-789-012-345-678-9 // could be other non numeric characters as well

Использование следующих функций не дает желаемых результатов

class StringToInteger {
    public static function getInteger($number) {
        return number_format($number, 0, '.', '');
    }
}

class NumericOnly {
    public static function formatNumber($number) {
        return preg_replace("/[^\d]/", "", $number); 
    }
}

Передать в виде числа:

$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"; 

Передать в виде строки:

$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"; 

Буквенно-цифровой

$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"; 

Любые идеи о том, как получитьдлинное целое число (полное правильное число)?

1 Ответ

2 голосов
/ 03 ноября 2011

Наибольшее целое число, которое может быть представлено в 64-битной установке PHP, по сравнению с вашим числом:

   9,223,372,036,854,775,808 - largest possible signed 64bit integer
  12,345,678,901,234,567,890 - your number

, так как вы превышаете максимальный размер номера, вы не можете ожидать полезных результатов, не используя что-то вроде bcmath / GMP .

...