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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Q&A

7回答

10809閲覧

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

yumikom

総合スコア11

C

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

0グッド

1クリップ

投稿2015/06/11 03:11

編集2022/01/12 10:55

###前提・実現したいこと
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/ツール等のバージョンなど)

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

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

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

投稿2015/06/11 04:02

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

C

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

投稿2015/08/18 03:26

ta-kun

総合スコア59

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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);

投稿2015/08/10 17:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2015/06/12 00:20

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumikom

2015/06/12 00:49

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

2015/06/12 02:28

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

2015/06/14 10:20

printfで小数部まで指定すると出ました。 実行確認:VC++ 2013 Ex) printf("%09.6f", 1.2); output 01.200000 注意するところは少数点の点も桁数に入っているところでしょうか。
guest

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);

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

投稿2015/06/11 04:50

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/11 04:35

kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumikom

2015/06/11 23:00

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

2015/06/12 01:22

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

0

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

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

投稿2015/06/11 04:31

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumikom

2015/06/11 22:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問