1

我正在开发一个与货币有关的程序。我一直在寻找一种像这样体面地显示货币价值的解决方案:

9,999.99 USD

请记住,在为某个变量赋值(金钱)时,不能插入逗号。

IE:

double money=9999.99;

并且在访问它时;

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

这将输出:

9999.99 USD

这不是我想要的,尤其是对于超过百分之一、千分之一、百万分甚至十亿位值的更大金额。

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

printf("9,999.99");

对于许多变量,这是不可取的。

谁能帮我吗?

4

4 回答 4

3

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

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

这可以通过函数setlocale更改

于 2013-02-10T07:23:04.903 回答
1

有一个函数strfmon可以帮助你

于 2013-02-10T07:24:12.287 回答
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
于 2013-02-10T07:45:35.323 回答
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;
}
于 2013-02-10T07:27:06.940 回答