1

私は通貨に関するプログラムに取り組んでいます。私はこのようにきちんとお金の値を表示するための解決策を見つけてきました:

9,999.99 USD

特定の変数に値(お金)を割り当てるときは、コンマを挿入しないでください。

すなわち:

double money=9999.99;

そしてそれにアクセスするとき;

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

出力されます:

9999.99 USD

これは私が望んでいることではありません。特に、100、1000、100万、さらには10億の位の値を超える大量の場合はそうです。

今では、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 に答える