0

重複の可能性:
1000000を1,000,000として出力します。

xxxxxxxx.xx(例:11526.99)の形式のfloat変数があります。カンマ付きで11,562.99と印刷したいのですが。Cにカンマを挿入するにはどうすればよいですか?

4

2 に答える 2

5

試す:

#include <locale.h>
#include <stdio.h>

int main()
{
    float f = 12345.67;

    // obtain the existing locale name for numbers    
    char *oldLocale = setlocale(LC_NUMERIC, NULL);

    // inherit locale from environment
    setlocale(LC_NUMERIC, "");

    // print number
    printf("%'.2f\n", f);

    // set the locale back
    setlocale(LC_NUMERIC, oldLocale);
}

これは、現在のロケールによって異なります。CおよびPOSIXロケールには、千単位の区切り文字がありません。環境からロケールを継承する代わりに、千単位の区切り文字を使用することがわかっているロケールに自分で設定できます。私のシステムでは、を使用"en_NZ"すると数千のセパレータが提供されます。

于 2013-01-30T04:41:02.680 に答える
0

以下のaddcommas関数はバージョンロケールなしで、負の浮動小数点を許可します (ただし、指数では機能しません3.14E10) 。

#include <stdio.h>
#include <string.h>

#define DOT     '.'
#define COMMA   ','
#define MAX     50

static char commas[MAX]; // Where the result is

char *addcommas(float f) {
  char tmp[MAX];            // temp area
  sprintf(tmp, "%f", f);    // refine %f if you need
  char *dot = strchr(tmp, DOT); // do we have a DOT?
  char *src,*dst; // source, dest

  if (dot) {            // Yes
    dst = commas+MAX-strlen(dot)-1; // set dest to allow the fractional part to fit
    strcpy(dst, dot);               // copy that part
    *dot = 0;       // 'cut' that frac part in tmp
    src = --dot;    // point to last non frac char in tmp
    dst--;          // point to previous 'free' char in dest
  }
  else {                // No
    src = tmp+strlen(tmp)-1;    // src is last char of our float string
    dst = commas+MAX-1;         // dst is last char of commas
  }

  int len = strlen(tmp);        // len is the mantissa size
  int cnt = 0;                  // char counter

  do {
    if ( *src<='9' && *src>='0' ) {  // add comma is we added 3 digits already
      if (cnt && !(cnt % 3)) *dst-- = COMMA;
      cnt++; // mantissa digit count increment
    }
    *dst-- = *src--;
  } while (--len);

  return dst+1; // return pointer to result
}

たとえば、それを呼び出す方法(主な例)

int main () {

   printf ("%s\n", addcommas(0.31415));
   printf ("%s\n", addcommas(3.1415));
   printf ("%s\n", addcommas(31.415));
   printf ("%s\n", addcommas(314.15));
   printf ("%s\n", addcommas(3141.5));
   printf ("%s\n", addcommas(31415));
   printf ("%s\n", addcommas(-0.31415));
   printf ("%s\n", addcommas(-3.1415));
   printf ("%s\n", addcommas(-31.415));
   printf ("%s\n", addcommas(-314.15));
   printf ("%s\n", addcommas(-3141.5));
   printf ("%s\n", addcommas(-31415));
   printf ("%s\n", addcommas(0));

  return 0;
}

コンパイル命令例

gcc -Wall comma.c -o comma

やっている

./comma

出力する必要があります

0.314150
3.141500
31.415001
314.149994
3,141.500000
31,415.000000
-0.314150
-3.141500
-31.415001
-314.149994
-3,141.500000
-31,415.000000
0.000000
  • DOTドットに設定
  • COMMAコンマであるべきものに設定します
  • MAX50 に設定すると、文字列として変換された float が 49 文字を超えないことを前提とします (MAX疑いの増加)
  • パラメータとして与えられたfloatからカンマを追加した文字列へのポインタ、つまり静的領域へ のポインタを返します。
    • addcommasは reentrant ではなく返されたポインターが指す値は (通常) 呼び出しごとに変更されます。
    • in char *a = addcommas(3.1415) ; char *b = addcommas(2.7182) ; aは、 addcommasの 2 回目の呼び出し後は安全に使用できなくなります
于 2013-01-30T07:07:30.393 に答える