找到int的"字符串长度"

Tho*_*son 6 c

基本上我想返回int - >值中的位数,如下所示:

(int)1 => 1
(int)123 => 3
(int)12345678 => 8
Run Code Online (Sandbox Code Playgroud)

我对C一无所知,所以请耐心等待.我知道目标c,但我使用整数和浮点数代替NSNumbers.我意识到我可以将int转换成客观的c对象,但这看起来很冒险,如果我能用C做到这一点,我将会知道它的未来.

谢谢

Mar*_*ner 23

使用

int d = (value == 0 ? 1 : (int)(log10(value)+1));
Run Code Online (Sandbox Code Playgroud)

请注意,这不适用于负数,您必须使用

int d = (value == 0 ? 1 : ((int)(log10(fabs(value))+1) + (value < 0 ? 1 : 0)));
Run Code Online (Sandbox Code Playgroud)

如果value是负数,则为减号添加1 .

  • (值<0?1:0)相当于(值<0) (2认同)
  • @Vovanium:是的,但是更具可读性.隐含的bool - > int转换让我感到不安. (2认同)

Cur*_*urd 13

可能比使用日志或int-to-string转换并且不使用任何库函数快得多,这是:

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;
}
Run Code Online (Sandbox Code Playgroud)

Jeff Yates关注后编辑:

对于那些担心int大小不同于32位的人(类似于pmg的解决方案,但仍然更快,因为乘法比分裂更快:-)

#include <limits.h>

#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;
}
Run Code Online (Sandbox Code Playgroud)


DVK*_*DVK 5

使用对数基数10:

int length = (int)floor(log10((float)number)) + 1; // works for >0
Run Code Online (Sandbox Code Playgroud)


pmg*_*pmg 5

这是另一种选择

int nDigits(unsigned i) {
    int n = 1;
    while (i > 9) {
        n++;
        i /= 10;
    }
    return n;
}
Run Code Online (Sandbox Code Playgroud)

这比使用更快log10,但比使用级联测试的Curd选项慢.但是它不假设ints是32位:-)