用逗号写出漂浮和双打的任何体面的方式?

时间:2013-02-10 07:12:38

标签: c

我正在开发一个与货币有关的计划。我一直在找到一个像这样显示货币价值的解决方案:

9,999.99 USD

请记住,在使用值(金钱)分配某个变量时,您不能插入逗号。

即:

double money=9999.99;

访问时;

printf("%.2l USD",money);

将输出:

9999.99 USD

这不是我想要的,尤其是超过百分之一,千分之一,百万分之一甚至十亿分之一的金额。

现在我找不到任何解决方案,而不是直接在printf上打印出所需的输出。

printf("9,999.99");

许多变量都是不受欢迎的。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:3)

请查看printf手册页,注意以下几点:

*“对于某些数字转换,使用基数字符(”小数点“)或数千个分组字符。使用的实际字符取决于语言环境的LC_NUMERIC部分.POSIX语言环境使用”。“作为基数字符,并且没有分组字符。因此,     printf(“%'。2f”,1234567.89); 结果在POSIX语言环境中为“1234567.89”,在nl_NL语言环境中为“1234567,89”,在da_DK语言环境中为“1.234.567,89”。“*

这可以通过函数setlocale

进行更改

答案 1 :(得分:1)

有一个功能,strfmon可以帮助你

答案 2 :(得分:1)

首先,不要使用浮点类型来表示钱,因为通常浮点类型是二进制的,因此不能精确地表示所有小数部分(美分),这些类型更容易出现舍入错误。使用整数代替美分而不是美元。

#include <stdio.h>
#include <limits.h>

unsigned long long ConstructMoney(unsigned long long dollars, unsigned cents)
{
  return dollars * 100 + cents;
}

void PrintWithCommas(unsigned long long n)
{
  char s[sizeof n * CHAR_BIT + 1];
  char *p = s + sizeof s;
  unsigned count = 0;
  *--p = '\0';
  do
  {
    *--p = '0' + n % 10;
    n /= 10;
    if (++count == 3 && n)
    {
      *--p = ',';
      count = 0;
    }
  } while (n);
  printf("%s", p);
}

void PrintMoney(unsigned long long n)
{
  PrintWithCommas(n / 100);
  putchar('.');
  n %= 100;
  putchar('0' + n / 10);
  putchar('0' + n % 10);
}

int main(void)
{
  PrintMoney(ConstructMoney(0, 0)); puts("");
  PrintMoney(ConstructMoney(0, 1)); puts("");
  PrintMoney(ConstructMoney(1, 0)); puts("");
  PrintMoney(ConstructMoney(1, 23)); puts("");
  PrintMoney(ConstructMoney(12, 34)); puts("");
  PrintMoney(ConstructMoney(123, 45)); puts("");
  PrintMoney(ConstructMoney(1234, 56)); puts("");
  PrintMoney(ConstructMoney(12345, 67)); puts("");
  PrintMoney(ConstructMoney(123456, 78)); puts("");
  PrintMoney(ConstructMoney(1234567, 89)); puts("");
  return 0;
}

输出(ideone):

0.00
0.01
1.00
1.23
12.34
123.45
1,234.56
12,345.67
123,456.78
1,234,567.89

答案 3 :(得分:0)

如果您正在使用标准库,则无法执行此操作 - 您必须编写一些手动执行此操作的代码。

我建议将值乘以100,转换为整数,并根据需要使用分隔符打印数字 - 处理整数上的单个数字要容易得多。

例如,以下代码将使用您拥有的值的字符串表示形式填充char *缓冲区:

void formatString (double number, char * buffer) {
  if (number < 0) {
    *buffer = '-';
    formatString(number, buffer + 1);
    return;
  }
  unsigned long long num = (unsigned long long) (number * 100);
  unsigned long long x; // temporary storage for counting the digits
  unsigned char digits;
  for (x = num / 1000, digits = 1; x; digits ++, x /= 10);
    // counts the digits, also ensures that there's at least one digit
  unsigned char pos; // digit position
  for (pos = 1, x = 100; pos < digits; pos ++, x *= 10);
    // reuses x as a value for extracting the digit in the needed position;
  char * current = buffer;
  for (pos = digits; pos; pos --) {
    *(current ++) = 48 + (num / x);
      // remember 48 + digit gives the ASCII for the digit
    if (((pos % 3) == 1) && (pos > 1)) *(current ++) = ',';
    num %= x;
    x /= 10;
  }
  *(current ++) = '.';
  *(current ++) = 48 + num / 10;
  *(current ++) = 48 + num % 10;
  *current = 0;
}