PHP: intval() equivalent pour les nombres> = 2147483647

en PHP 5, j'utilise intval () chaque fois que j'obtiens des nombres comme entrée. De cette façon, je veux m'assurer que je n'ai pas de chaînes ou des nombres décimaux. Mes numéros d'entrée devraient tous être en nombres entiers. Mais quand j'obtiens des nombres >= 2147483647, la limite entière signée est franchie.

Que puis-je faire pour avoir un intval() équivalent pour les nombres dans toutes les tailles?

Voici ce que je veux:

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

Merci beaucoup d'avance!

modifier: basé sur certains les réponses, j'ai essayé de coder une fonction équivalente. Mais cela ne fonctionne pas exactement comme intval() le fait encore. Comment puis-je l'améliorer? Quel est le problème avec elle?

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;
        }
    }
}
24
demandé sur George Claghorn 2009-06-13 13:38:53
la source

6 ответов

essayez cette fonction, elle supprimera correctement toute décimale comme intval le fait et supprimera tout caractère non-numérique.

<?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 />";
?>

Voici la sortie produite:

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

espérons que cela aide!

20
répondu defines 2009-06-16 17:18:41
la source

Vous pouvez également utiliser des expressions régulières pour supprimer tout après les parties numériques initiales:

<?php
$inputNumber = "3147483647.37";
$intNumber = preg_replace('/^([0-9]*).*$/', "\1", $inputNumber);
echo $intNumber; // output: 3147483647
?>
6
répondu SztupY 2009-06-16 17:20:44
la source

utiliser number_format($inputNumber, 0, '', '')

Ou si vous voulez seulement de vérifier si ses un nombre entier puis utilisez ctype_digit($inputNumber)

Ne pas utiliser la proposition is_numeric, comme aussi les flotteurs sont numériques. par exemple,"+0123.45e6 accepté par is_numeric

2
répondu jitter 2009-06-13 13:54:46
la source
sprintf("%.0f", 3147483647.37) // 3147483647

cependant, les deux solutions souffrent de float overflow, par exemple:

sprintf("%.0f", 314734534534533454346483647.37) // 314734534534533440685998080
2
répondu Artem Russakovskii 2009-06-13 14:01:40
la source
<?php
$a = 453453445435.4;

echo $bigint = floor($a);
1
répondu user3050705 2014-02-08 03:34:50
la source

si vous voulez manipuler des nombres de précision arbitraire, vous devrez utiliser le gmp extension. La fonction gmp_init(), par exemple, convertit une chaîne de caractères en un objet ressource gmp. l'inconvénient est que vous devez utiliser d'autres fonctions de l'extension à d'autres processus que l'objet. La conversion en chaîne se fait en utilisant gmp_strval(), par exemple.

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

Vous voudrez peut-être que vérifier que la chaîne est représentant un nombre valide et utiliser la chaîne elle-même, si vous n'avez pas l'intention de faire toutes les opérations sur la valeur. Cela peut être fait en utilisant une expression régulière:

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

une Autre option est d'utiliser is_numeric(). Mais cette fonction fait plus de conversion que vous pourriez aimer. Citant docs de cette fonction:

... +0123.45e6 est une valeur numérique valide ...

0
répondu soulmerge 2009-06-16 17:47:05
la source

Autres questions sur