例如,如果我的号码为 390000 ,则需要打印为 390 000 。 如果我的号码为 1200000 ,则会打印为 1 200 000 等。
最初我考虑过将long long int赋值给一个字符串,然后为每个可能的字符串长度编写if语句,因为只有11种可能的长度,但这看起来真的很麻烦且不必要。
有更简单的方法吗?
答案 0 :(得分:1)
如果您使用的是POSIX系统且某个区域设置将该空格用作数字分组符号,请使用'
转换说明符中的撇号(printf()
)。
setlocale(LC_NUMERIC, "SOMETHING");
printf("%'d", 345678); // 345 678
答案 1 :(得分:0)
您可以通过启动足够大小的缓冲区来存储完整的long long
数字(和分隔符),然后使用指针算法每隔3个数字插入一个分隔符,从而可以非常轻松地完成此操作。例如,MAXN
为32
,您可以执行以下操作:
/** separate long long value every 3rd char into 's' */
char *sepnumber (char *s, long long val)
{
char numstr[MAXN] = "";
char *p = s + MAXN - 2;
size_t idx = 0, len = 0;
len = sprintf (numstr, "%lld", val);
while (len--) {
if (idx++ == 3) {
idx = 1;
*p-- = ' ';
}
*p = numstr[len];
if (len) p--;
}
for (idx = 0; *p; p++, idx++) s[idx] = *p; /* copy to s */
s[idx] = *p; /* nul-terminate */
return s;
}
一个简单的例子是:
#include <stdio.h>
#include <stdlib.h>
#define MAXN 32
char *sepnumber (char *s, long long val);
int main (int argc, char **argv) {
long long int lv = argc > 1 ? strtoll (argv[1], NULL, 10) : 1931583282;
char fmtnum[MAXN] = "";
printf (" %lld => %s\n", lv, sepnumber (fmtnum, lv));
return 0;
}
/** separate long long value every 3rd char into 's' */
char *sepnumber (char *s, long long val)
{
char numstr[MAXN] = "";
char *p = s + MAXN - 2;
size_t idx = 0, len = 0;
len = sprintf (numstr, "%lld", val);
while (len--) {
if (idx++ == 3) {
idx = 1;
*p-- = ' ';
}
*p = numstr[len];
if (len) p--;
}
for (idx = 0; *p; p++, idx++) s[idx] = *p; /* copy to s */
s[idx] = *p; /* nul-terminate */
return s;
}
示例使用/输出
$ ./bin/sepnum
1931583282 => 1 931 583 282
$ ./bin/sepnum 2212
2212 => 2 212
答案 2 :(得分:0)
使用Duff设备的另一种方式:
//tr[position() > 1][@class='row1' or not(starts-with(@class, 'excludeRow'))]
输出
#include <stdio.h>
static char *sep(char *str, long long value)
{
char tmp[32];
char *p = tmp;
char *q = str;
int len;
len = snprintf(tmp, sizeof tmp, "%lld", value);
if (*p == '-') { // Support for negatives
*q++ = *p++;
len--;
}
/*
* Consider 5 mod 3
* len % 3 is evaluated only once. E.g. 5 % 3 = 2
* jumps into the middle of the loop (in this case to "case 2:")
* case 2 and case 1 are evaluated
* loops until NUL is reached evaluating all cases
*/
switch (len % 3) do {
*q++ = ' ';
case 0: *q++ = *p++;
case 2: *q++ = *p++;
case 1: *q++ = *p++;
} while (*p);
*q = '\0';
return str;
}
int main(void)
{
char str[32];
printf("%s\n", sep(str, 1200000));
return 0;
}
答案 3 :(得分:0)
这是一个简单的版本,没有任何废话。可能还有更有效的方法,但如果是这样,它们不包括字符串处理或浮点数。
#include <stdio.h>
#include <inttypes.h>
#include <stdbool.h>
static void print_number (uint32_t n)
{
static bool remove_zeroes = true;
if(remove_zeroes)
{
remove_zeroes = false;
printf("%" PRIu32 " ", n);
}
else
{
printf("%.3" PRIu32 " ", n);
}
}
void print_number_with_spaces (uint32_t n)
{
bool remove_zeroes = true;
while(n > 1000)
{
uint32_t tmp = n;
uint32_t subtract = 1;
while(tmp > 1000)
{
tmp /= 1000;
subtract *= 1000;
}
print_number(tmp);
if(subtract >= 1000)
{
n -= tmp*subtract;
}
}
print_number(n);
}
int main(int argc, char* argv[])
{
print_number_with_spaces(1200000);
}
答案 4 :(得分:0)
使用分隔数千个位置的空格进行打印的简单方法是使用递归。也适用于负值。
void print_1000(long long x) {
long long msgroups = x / 1000;
int lsgroup = x % 1000;
if (msgroups) {
print_1000(msgroups);
char separator = ' '; // adjust as deisred
printf("%c%03d", separator, abs(lsgroup));
} else {
printf("%d", lsgroup);
}
}
样本用法
int main(void) {
print_1000(0); puts("");
print_1000(-1); puts("");
print_1000(LLONG_MAX); puts("");
print_1000(LLONG_MIN); puts("");
return 0;
}
输出
0
-1
9 223 372 036 854 775 807
-9 223 372 036 854 775 808
答案 5 :(得分:-3)
我想出的一个快速解决方案是:
output = []
number = '1209873'
aux = reversed(list(number))
counter = 0
for digit in aux:
output.append(digit)
counter += 1
if counter % 3 == 0:
output.append(' ')
spaced_number = reduce(lambda x, y: x + y, reversed(output))
但我确信有更有效的方法可以解决您的问题。 ;)