encontrar la “longitud de la cuerda” de un int

básicamente quiero devolver el número de dígitos en los valores de int -> así:

(int)1 => 1 (int)123 => 3 (int)12345678 => 8 

No sé nada acerca de C, así que por favor tengan paciencia conmigo. Conozco el objective c, pero uso ints y floats en lugar de NSNumbers. Me doy cuenta de que podría convertir los ints en objetos objectives c, pero esto parece fofo, y si puedo hacerlo con C lo sabré para el futuro.

Gracias

utilizar

 int d = (value == 0 ? 1 : (int)(log10(value)+1)); 

Tenga en cuenta que esto no funciona con números negativos, tendrá que usar

 int d = (value == 0 ? 1 : ((int)(log10(fabs(value))+1) + (value < 0 ? 1 : 0))); 

que agrega 1 para el signo menos, si el value es negativo.

Probablemente sea mucho más rápido que usar el registro o la conversión int-to-string y sin usar ninguna función de biblioteca es esto:

 int nDigits(int i) { if (i < 0) i = -i; if (i < 10) return 1; if (i < 100) return 2; if (i < 1000) return 3; if (i < 10000) return 4; if (i < 100000) return 5; if (i < 1000000) return 6; if (i < 10000000) return 7; if (i < 100000000) return 8; if (i < 1000000000) return 9; return 10; } 

EDITAR después de las preocupaciones de Jeff Yates:

Para aquellos que se preocupan por los tamaños int diferentes de 32 bits (similar a la solución de pmg pero aún más rápido porque la multiplicación es más rápida que la división 🙂

 #include  #define PO10_LIMIT (INT_MAX/10) int nDigits(int i) { int n,po10; if (i < 0) i = -i; n=1; po10=10; while(i>=po10) { n++; if (po10 > PO10_LIMIT) break; po10*=10; } return n; } 

Usa logaritmos base 10:

 int length = (int)floor(log10((float)number)) + 1; // works for >0 

Aquí hay otra opción

 int nDigits(unsigned i) { int n = 1; while (i > 9) { n++; i /= 10; } return n; } 

Esto es más rápido que usar log10 , pero más lento que la opción de Curd con las pruebas en cascada. Sin embargo, no asume que los int son 32 bits 🙂

Una solución más general, especialmente si desea conocer la longitud para imprimir con variantes printf() es:

 snprintf(NULL, 0, "%d", myint); 

El valor de retorno debe indicar la longitud de la cadena que se imprimirá.

Si su valor entero (por ejemplo, 12345678u ) es una constante de comstackción, puede dejar que el comstackdor determine la longitud para usted:

 template constexpr unsigned int_decimal_digits(T value) { return ( value / 10 ? int_decimal_digits(value/10) + 1 : 1 ); } 

Uso:

 unsigned n = int_decimal_digits(1234); // n = 4 #include  unsigned m = int_decimal_digits(ULLONG_MAX); // m = maximum length of a "long long unsigned" on your platform 

De esta manera, el comstackdor calculará el número de decimales automáticamente y completará el valor como una constante. Debería ser la solución más rápida posible, ya que no hay cálculos de tiempo de ejecución implicados y las constantes enteras se suelen colocar en los códigos de operación de la instrucción. (Esto significa que viajan por canalización de instrucciones, no por memoria / caché de datos). Sin embargo, esto requiere un comstackdor que admita C ++ 11.