代码之家  ›  专栏  ›  技术社区  ›  Thomas Clayson

查找int的“字符串长度”

c
  •  6
  • Thomas Clayson  · 技术社区  · 14 年前

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

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

    谢谢

    6 回复  |  直到 14 年前
        1
  •  24
  •   MartinStettner    14 年前

    使用

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

    注意,这对负数不起作用,您必须使用

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

    如果负号加1 value 是阴性的。

        2
  •  13
  •   Curd    14 年前

    可能比使用log或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;
    }
    

    在Jeff Yates关注之后:

    对于那些担心整数大小与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;
    }
    
        3
  •  5
  •   DVK    14 年前

    使用以10为底的对数:

    int length = (int)floor(log10((float)number)) + 1; // works for >0
    
        4
  •  5
  •   pmg    14 年前

    还有一个选择

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

    这比使用 log10 int s是32位:-)

        5
  •  2
  •   aib    14 年前

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

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

        6
  •  1
  •   ManuelAtWork    8 年前

    如果你的整数值(例如。 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的编译器。