Question

Disons que j'ai une variable contenant un nombre entier ou un flotteur (car entiers pourraient déborder dans un flotteur en PHP).

Je veux lancer une opération pour obtenir le plus à gauche et le reste des chiffres restants.

Pour mieux expliquer:

<?php

$x   = NULL;  //this will hold first digit
$num = 12345; //int

/// run operation


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);

?>

Maintenant, je sais qu'il ya une multitude de façons de le faire si vous représentez le numéro comme une chaîne, mais je suis en train de type éviter la coulée dans une chaîne.

Je suis probablement à la recherche d'une solution qui comprend des opérations au niveau du bit, mais je suis assez faible dans ce sujet donc je suis en espérant que quelqu'un qui travaille habituellement bas niveau pourrait être en mesure de répondre à cette!

Merci un groupe.

Était-ce utile?

La solution

Evite en utilisant toute manipulation de chaîne, mais aucune garantie pour flotter ou même des valeurs négatives

$x   = NULL;  //this will hold first digit
$num = 12345; //int

$m = 1;
while(true) {
    $m *= 10;
    if ($m > $num)
        break;
}

$m /= 10;

$x = (int) floor($num / $m);
$num = $num % $m;


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);

Autres conseils

Je suis sûr qu'il ya un moyen de le faire sans le jeter à une chaîne, mais pourquoi? Le détour string est si facile:

$x = (int)substr($num, 0, 1); 

Il vous donnera un joli entier approprié.

De toute évidence, cela ne fait aucun contrôle étendu pour l'entrée défectueuse et nécessite $num être un numéro valide.

méthode Math seule:

function leftMost($num) {  
    return floor($num/pow(10,(floor((log10($num))))));
}

explique je suppose ...

1+ log10 de num calcule le nombre de chiffres d'un numéro est, nous étage pour supprimer toutes les valeurs décimales, mettez comme l'exposant pour un certain nombre de 1 chiffres, nous obtenons 10 ^ 0 = 1, ou un numéro à 8 chiffres nous obtenons 10 ^ 8. Nous sommes alors juste divding 12345678/10000000 = 1,2345678, qui obtient floor'd et est à seulement 1.

Note:. Cela fonctionne pour des nombres compris entre zéro et un aussi, où il retournera le 2 0,02, et une chaîne de transformation échouera

Si vous voulez travailler avec des nombres négatifs, faire $ num = abs ($ num) d'abord.

Pour obtenir le reste des chiffres

  

$ remainingnum = (int) substr ((string) $ num, 1, strlen ($ num));

Si vous typcast la valeur à une chaîne, vous pouvez utiliser le sélecteur de type tableau.

Par exemple:

$n = (string)12345676543.876543;
echo (int)$n[0];

Baker a offert la @ Mark meilleure solution, bien que vous devriez faire abs(floor($num)) avant d'appliquer l'algorithme.

Je sais que vous avez dit que vous vouliez éviter la coulée à une chaîne, mais si vous voulez faire une boucle sur les chiffres en PHP, ce sera la plus rapide:

$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
  $d = $n[$i];

Dans une référence rapide et sale, il était d'environ 50% plus rapide que l'ensemble équivalent d'expressions mathématiques, même en minimisant les appels à log et exp.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top