Pregunta

Digamos que tengo una variable que contiene un número entero o un flotador (ya que los números enteros podrían desbordar en un flotador en PHP).

Quiero ejecutar alguna operación para obtener el dígito más a la izquierda y el resto de los dígitos restantes.

Para explicar mejor:

<?php

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

/// run operation


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

?>

Ahora, sé que hay una multitud de maneras de hacer esto si usted representa el número como una cadena, pero estoy tratando de evitar la proyección de tipo en una cadena.

Estoy probablemente en busca de una solución que incluye operaciones bit a bit, pero estoy bastante débil en ese tema, así que estoy esperando que alguien que trabaja habitualmente de bajo nivel podría ser capaz de responder a esta!

Gracias un montón.

¿Fue útil?

Solución

Evita el uso de cualquier manipulación de cadenas, pero no hay garantías para flotar o incluso valores negativos

$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);

Otros consejos

Estoy seguro de que hay una manera de hacer esto sin poner en una cadena, pero ¿por qué? El desvío string es tan fácil:

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

Te dará una bonita, número entero adecuado.

Obviamente, esto no realiza comprobaciones de extendido para la entrada defectuosa, y requiere $num ser un número válido.

Math-único método:

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

explicó supongo ...

1+ log10 de num calcula el número de dígitos de un número, que suelo para eliminar cualquiera de los valores decimales, ponerlo como el exponente de modo para un número 1 dígitos obtenemos 10 ^ 0 = 1, o un número de 8 dígitos obtenemos 10 ^ 8. A continuación, sólo estamos divding 12345678/10000000 = 1,2345678, que consigue floor'd y está a sólo 1.

Nota:. Esto funciona para los números entre cero y uno también, donde se le devolverá el 2 de 0,02, y una cadena transformar fallará

Si desea trabajar con números negativos, hacer $ num = abs ($ num) en primer lugar.

Para obtener el resto de los dígitos

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

Si typcast el valor en una cadena se puede utilizar el selector de tipo de matriz.

Por ejemplo:

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

@ Marcos Baker, ofreció la mejor solución, a pesar de que debe hacer abs(floor($num)) antes de aplicar el algoritmo.

Sé que usted dijo que quería evitar la proyección de una cadena, pero si quieres para recorrer los dígitos en PHP, esta será la manera más rápida:

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

En un punto de referencia rápido y sucio-, que fue alrededor de 50% más rápido que el conjunto equivalente de expresiones matemáticas, incluso cuando minimizando las llamadas a log y exp.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top