找到int的“字符串长度”

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

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

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

谢谢

使用

 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。

可能比使用日志或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关注后编辑

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

 #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; } 

使用对数基数10:

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

这是另一种选择

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

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

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

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

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

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

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

用法:

 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 

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