long - php string to integer



PHP:intval()에 해당하는 숫자>=2147483647 (4)

PHP 5에서는 숫자를 입력으로 사용할 때마다 intval ()을 사용합니다. 이렇게하면 문자열이나 부동 소수점이 없는지 확인할 수 있습니다. 입력 번호는 모두 정수 여야합니다. 그러나 2147483647 이상의 숫자를 얻으면 부호있는 정수 제한을 초과합니다.

모든 크기의 숫자에 대해 intval ()을 사용하려면 어떻게해야합니까?

여기에 내가 갖고 싶은 것이있다.

<?php
$inputNumber = 3147483647.37;
$intNumber = intvalEquivalent($inputNumber);
echo $intNumber; // output: 3147483647
?>

대단히 감사드립니다!

편집 : 일부 답변을 바탕으로, 나는 동등한 기능을 코드하려고했습니다. 하지만 intval ()이 아직 작동하지 않습니다. 어떻게 개선 할 수 있습니까? 그게 뭐가 잘못 되었 니?

function intval2($text) {
    $text = trim($text);
    $result = ctype_digit($text);
    if ($result == TRUE) {
        return $text;
    }
    else {
        $newText = sprintf('%.0f', $text);
        $result = ctype_digit($newText);
        if ($result == TRUE) {
            return $newText;
        }
        else {
             return 0;
        }
    }
}

https://src-bin.com


Answer #1

number_format 외에도 sprintf를 사용할 수 있습니다.

sprintf("%.0f", 3147483647.37) // 3147483647

그러나 두 솔루션 모두 부동 소수점 오버플로가 발생합니다 (예 :

sprintf("%.0f", 314734534534533454346483647.37) // 314734534534533440685998080

Answer #2

다음과 같이 정규 표현식을 사용하여 모든 부분을 제거 할 수 있습니다.

<?php
$inputNumber = "3147483647.37";
$intNumber = preg_replace('/^([0-9]*).*$/', "\\1", $inputNumber);
echo $intNumber; // output: 3147483647
?>

Answer #3

이 함수를 사용하면 intval과 같이 십진수를 적절히 제거하고 숫자가 아닌 문자를 모두 제거합니다.

<?php
function bigintval($value) {
  $value = trim($value);
  if (ctype_digit($value)) {
    return $value;
  }
  $value = preg_replace("/[^0-9](.*)$/", '', $value);
  if (ctype_digit($value)) {
    return $value;
  }
  return 0;
}

// SOME TESTING
echo '"3147483647.37" : '.bigintval("3147483647.37")."<br />";
echo '"3498773982793749879873429874.30872974" : '.bigintval("3498773982793749879873429874.30872974")."<br />";
echo '"hi mom!" : '.bigintval("hi mom!")."<br />";
echo '"+0123.45e6" : '.bigintval("+0123.45e6")."<br />";
?>

생성 된 출력은 다음과 같습니다.

"3147483647.37" : 3147483647
"3498773982793749879873429874.30872974" : 3498773982793749879873429874
"hi mom!" : 0
"+0123.45e6" : 0

희망이 도움이됩니다!


Answer #4

임의 정밀도 숫자를 처리하려면 gmp 확장자를 사용해야합니다. 예를 들어, gmp_init() 함수는 문자열을 gmp 자원 객체로 변환합니다. 단점은 해당 확장을 처리하는 다른 기능을 사용해야한다는 것입니다. 다시 문자열로 변환하는 것은 예를 들어 gmp_strval() 사용하여 수행됩니다.

$gmpObject = gmp_init($string, 10);
if ($gmpObject === FALSE) {
    # The string was not a valid number,
    # handle this case here
}
echo gmp_strval($gmpObject);

값에 대한 연산을 수행하지 않으려는 경우에만 문자열이 유효한 숫자를 나타내는 지 확인 하고 문자열 자체를 사용할 수 있습니다. 그것은 정규식을 사용하여 수행 할 수 있습니다.

$containsInt = preg_match('/^\d+$/', $string);
# Or for floating point numbers:
$containsFloat = preg_match('/^\d+(.\d+)?$/', $string);
echo $string;

또 다른 옵션은 is_numeric() 을 사용하는 것입니다. 그러나 그 기능은 당신이 좋아할 것보다 더 많은 전환을합니다. 해당 기능의 문서에서 인용 :

... + 0123.45e6은 유효한 숫자 값입니다 ...





integer