Форматирование целого числа или строки в длинное целое число (без научной нотации / усеченных / округленных чисел)

#php #string #integer #number-formatting #long-integer

#php #строка #целое #форматирование чисел #длинное целое число

Вопрос:

Вывод: решение Marc B является 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:

Наибольшее целое число, которое может быть представлено в 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.

Комментарии:

1. извините, максимальная длина равна 19, спасибо, что указали на это. Это было исправлено. Та же проблема, что и при усечении числа

2. Глядя на GMP, я могу использовать $number = gmp_abs($number); вернуть gmp_strval($number); но это работает только в строковом формате. Есть мысли о передаче double / int ?