質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • C

    3805questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

c言語 floatを二桁の整数で表示したい(1→01、10→10)

受付中

回答 7

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,038

yumikom

score 3

前提・実現したいこと

float型を整数で表示させたい。




[以下は解決済み]
数字で金額を入力し、それを英語に変換して表示したいです。
例えば
[入力]1234.11
[出力]One Thousand Two Hundred Thirty Four Dollars and ... 11 Cents
と表示させたいのですが、float型を使うのが必須の課題です。

発生している問題・エラーメッセージ

今日プロフェッサーに直接課題の事も聞けたのもあって、ほぼ完成しました。
ただ一番最後の " 00 Cents" と表示したいところだけが上手くいきません。
10以上の数字は問題ないのですが、一桁と1−9までが駄目です。
というのも、一桁の数字も01、02ー09と二桁で表示したいからです。



[以下は解決済み]
floatで入力された数字をどのようにして、一つずつの数字としてピックアップすればいいのでしょうか?
そしてその数字を文字に変換する方法はどのようにするのでしょうか?
1→one,2→two。。。と登録?をしたいです。

ソースコード

だいぶ長いプログラムになってしまったのです、端折ります。。

#include <stdio.h>

int main( ) {
    float money,fraction;
    int whole,a,b,c,d;
 
    printf("Enter a monetary value from $0.01 to $9999.99 inclusive: ");
    scanf("%f",&money);

    whole = (int)money;
    fraction = (money - whole) * 100;
  
  ------端折ってます-----
 if(fraction == 0){
     printf("00 Cents\n");
 }      
 else{ 
     printf("%.f Cents\n",fraction);

この"%.f"の部分をどうしたら、1を01と表示させることができますか??



###補足情報(言語/FW/ツール等のバージョンなど)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

0

sprintf()で、数値を文字列に変換できますので、その文字列を先頭から1文字ずつ処理する。

単語に直すのは、ifcaseで比較してやるか、文字を数値に直して"one" "two"などの入った文字列配列の添え字にするかですが、あまり本質でないような気がするので、switch/caseでいいんじゃないでしょうか。ピリオドも対象でしょうし。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Rubyで、整数について書いたものがありますので、参考になると思います。

やり方としては、先に整数部分を処理して、あとは整数だけ引いてしまって、小数部分が残っているかで処理をするのがいいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/12 07:58

    簡潔でやり方がとても理解しやすかったです。ありがとうございます。
    回答を見ると、そうだよなーと思うのですが、自力で考えるとなかなか単純なことも思いつかないものですね。。

    キャンセル

0

1)まずfloatの値をintにキャストして整数を取り出します
2)intにした値を10で割った値を1桁目の文字列として配列の1番目記憶します
3)intを10でわります
4)1/10になったintを10で割った値が1の場合は配列の1番目の文字列を置き換えますそれ以外の場合は10桁目の文字列を配列の2番目に入れます
5)intを10で割ります
6)上を繰り返して1000の桁までを配列に入れます
7)配列を数字の大きい方から出力します(ドルまで完成)
8)再度floatからintにキャストした値とfloatで差分を取ります
9)差分があったらセントを出力します

若干端折りましたがこんな感じで処理のイメージはできますか?
作った処理を
printf("PAY TO THE ORDER OF YOU\n");
前か後ろに書きます

変換の方法は10の桁用、10の桁が1の時用、それ以外の時用の配列かselect/case文を書くことになります

※ついでに  if(monetary >= 0.01 || monetary <= 9999.99)だと0.01以上か9999.99以下の少数なので常に成立してしまいますよ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/12 08:00

    補足ありがとうございます。if分の条件全く気づいておりませんでした。

    キャンセル

  • 2015/06/12 10:22

    2桁表示はこんな感じですかね

    int dollar = floorf(money); // ドル部分を取り出す
    float cent = (money - dollar) * 100; // 全体からドルを引いてセントを出す
    printf("%02d Cents", floorf(cent)); // 書式指定(0埋め2桁)で表示

    キャンセル

0

こんな感じですかね。

float mony = 1234.11f;
int doru = (int)(mony);
int cent = (int)((mony*100)%100); 
char text[][] = {
"zero",
"one",
"tow", 
...略
"nain",
};

  • 中略 -
① doruを1文字づつ切り分ける
② countが桁数
③ num[]ここに一桁の数字を入れる

for( i = 0; i < count; i++ )
{
printf( "%s,", text[num[i]]);
}

printf( "cent = %d",cent);

これをもとにいじって頂ければできると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

01 と表示するのは、書式フォーマットです。
"%02d" これで0がでます
"%02f"  浮動小数はこちらですね。
書式については、printf()関数のところか、エスケープシーケンスあたりででてきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/12 09:49

    回答ありがとうございます。
    "%02f"としてみたところ、1と入力すると、1.000000 と表示されてしまいました。
    適当に"%0.2f"にしてみたら、1が1.00になりました。
    01と表示したいのですが、無理なのでしょうか??

    キャンセル

  • 2015/06/12 11:28

    int キャストするといけますね。
    int c = (int)(1.23f);
    printf("%02d",c);

    キャンセル

  • 2015/06/14 19:20

    printfで小数部まで指定すると出ました。
    実行確認:VC++ 2013
    Ex)
    printf("%09.6f", 1.2);

    output
    01.200000

    注意するところは少数点の点も桁数に入っているところでしょうか。

    キャンセル

0

機能的には下記のように変更してコンパイルすれば、小数点以下の2桁が0パディングした表示になります。
変更前 printf("%.f Cents\n",fraction); 
変更後 printf(".02d Cents\n",fraction);

fraction変数は下記の部分で整数にキャストした方が綺麗になると思います。
変更前(float) fraction = (money - whole) * 100; 
変更後(int) fraction = (int)((money - whole) * 100); 

別解として、scanf で文字列で受け取り sscanf 関数で、整数部と小数部を別々の整数型の変数で
取得することで、誤差の無いプログラムに仕上がります。
scanf("%s", money);
sscanf(money,"%d.%d", &seisu,&syousu);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

これで、表示できますよ。

printf("%02.f Cents\n", fraction);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3805questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。