5

ロングフロートをCの通貨と​​してフォーマットしようとしています。最初にドル記号を配置し、小数点の前に3桁ごとにコンマを繰り返し、小数点の直前にドットを配置します。これまでのところ、私は次のような数字を印刷しています。

printf("You are owed $%.2Lf!\n", money);

これは次のような何かを返します

You are owed $123456789.00!

数字次のようになります

$123,456,789.00
$1,234.56
$123.45

回答は実際のコードである必要はありません。スプーンで餌をやる必要はありません。役立つc関連の詳細がある場合は、言及してください。それ以外の場合、擬似コードは問題ありません。

ありがとう。

4

3 に答える 3

11

あなたはすでに旗printfを使ってそれを単独で行うことができるかもしれません。'ただし、おそらくロケールを設定する必要があります。これが私のマシンの例です:

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

int main(void)
{
    setlocale(LC_NUMERIC, "");
    printf("$%'.2Lf\n", 123456789.00L);
    printf("$%'.2Lf\n", 1234.56L);
    printf("$%'.2Lf\n", 123.45L);
    return 0;
}

そしてそれを実行します:

> make example
clang -Wall -Wextra -Werror    example.c   -o example
> ./example 
$123,456,789.00
$1,234.56
$123.45

このプログラムは、私のMac(10.6.8)とLinuxマシン(Ubuntu 10.10)の両方で希望どおりに動作します。

于 2012-07-27T20:21:10.360 に答える
2

私はこれがかなり古い投稿であることを知っています、しかし私はman今日ウサギの穴から姿を消したので、私は私の旅行を記録すると思いました:

これを実行し、ローカルまたは国際標準に従って実行するためにstrfmon()含めることができると呼ばれる関数があります。monetary.h

のように機能し、文字列で指定された形式と同じ数の引数printf()を取ることに注意してください。double%

私がここに持っているものよりもはるかに多くのものがあり、このページが最も役立つことがわかりました:https ://www.gnu.org/software/libc/manual/html_node/Formatting-Numbers.html

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

int main(){
    // need to setlocal(), "" sets locale to the system locale
    setlocale(LC_ALL, "");

    double money_amt = 1234.5678;

    int buf_len = 16;
    char simple_local[buf_len];
    char international[buf_len];
    char parenthesis_for_neg[buf_len];
    char specified_width[buf_len];
    char fill_6_stars[buf_len];
    char fill_9_stars[buf_len];
    char suppress_thousands[buf_len];

    strfmon(simple_local, buf_len-1, "%n", money_amt);
    strfmon(international, buf_len-1, "%i", money_amt);
    strfmon(parenthesis_for_neg, buf_len-1, "%(n", money_amt);
    strfmon(specified_width, buf_len-1, "%#6n", money_amt);
    strfmon(fill_6_stars, buf_len-1, "%=*#6n", money_amt);
    strfmon(fill_9_stars, buf_len-1, "%=*#8n", money_amt);
    strfmon(suppress_thousands, buf_len-1, "%^=*#8n", money_amt);

    printf( "===================== Output ===================\n"\
            "Simple, local:                  %s\n"\
            "International:                  %s\n"\
            "parenthesis for negatives:      %s\n"\
            "fixed width (6 digits):         %s\n"\
            "fill character '*':             %s\n"\
            "-- note fill characters don't\n"\
            "-- count where the thousdands\n"\
            "-- separator would go:\n"\
            "filling with 9 characters:      %s\n"\
            "Suppress thousands separators:  %s\n"\
            "================================================\n",
            simple_local, international, parenthesis_for_neg,
            specified_width, fill_6_stars, fill_9_stars,
            suppress_thousands);

    /** free(money_string); */
    return 0;
}
===================== Output ===================
Simple, local:                  $1,234.57
International:                  USD1,234.57
parenthesis for negatives:      $1,234.57
fixed width (6 digits):          $  1,234.57
fill character '*':              $**1,234.57
-- note fill characters don't
-- count where the thousdands
-- separator would go:
filling with 9 characters:       $*****1,234.57
Suppress thousands separators:   $****1234.57
================================================
于 2019-07-13T21:02:27.950 に答える
0

それを行うためのC関数はないと思いますが、自分で作成することはできますか?言うfloat price = 23234.45。最初(int)priceにコンマで印刷し、小数点を印刷します。次に、小数部分については、printf("%d", (int)(price*100)%100);

于 2012-07-27T20:16:37.923 に答える