我正在开发一个与货币有关的计划。我一直在找到一个像这样显示货币价值的解决方案:
9,999.99 USD
请记住,在使用值(金钱)分配某个变量时,您不能插入逗号。
即:
double money=9999.99;
访问时;
printf("%.2l USD",money);
将输出:
9999.99 USD
这不是我想要的,尤其是超过百分之一,千分之一,百万分之一甚至十亿分之一的金额。
现在我找不到任何解决方案,而不是直接在printf上打印出所需的输出。
printf("9,999.99");
许多变量都是不受欢迎的。
任何人都可以帮助我吗?
答案 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;
}