找到int的“字符串长度”

时间:2010-11-10 09:35:36

标签: c

基本上我想要返回int中的位数 - >像这样的价值观:

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

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

由于

6 个答案:

答案 0 :(得分:23)

使用

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

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

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

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

答案 1 :(得分:12)

可能比使用日志或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;
}
杰夫耶茨担心之后

编辑

对于那些担心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;
}

答案 2 :(得分:5)

使用logarithms base 10:

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

答案 3 :(得分:5)

这是另一个选择

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

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

答案 4 :(得分:2)

更通用的解决方案,特别是如果您想知道使用printf()变体打印的长度是:

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

返回值应告诉您要打印的字符串的长度。

答案 5 :(得分:1)

如果您的整数值(例如12345678u)是编译时常量,您可以让编译器为您确定长度:

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

用法:

unsigned n = int_decimal_digits(1234); 
// n = 4

#include <limits.h>
unsigned m = int_decimal_digits(ULLONG_MAX);
// m = maximum length of a "long long unsigned" on your platform

这样,编译器将自动计算小数位数,并将值填入常量。它应该是最快的解决方案,因为不涉及运行时计算,并且通常将整数常量放入指令操作码中。 (这意味着它们通过指令管道传输,而不是通过数据存储器/缓存传输。)但是,这需要一个支持C ++ 11的编译器。