#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 ?