• ベストアンサー

金額!?

こんにちは。またまた質問させていただきます。 C言語のご質問です。 double okane; /* お金 */ <何らかの処理で変数okaneにデータ挿入> この取得したokaneの中身を たとえば、10000なら→\10,000としたいのですが、 自分なりにかんがえたのですがちょっとわかりませんでした。 もちろん\10,000 や\5,000や\100が入る変数は配列です。 質問自体が意味不明かもしれませんが ご回答宜しくお願い致します。

  • 653
  • お礼率36% (138/382)

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

ざっと書いてみました。こんな感じ? #include <stdio.h> char* print_with_comma(char* buf, double v) {   char work[1024];   char* s;   char* t;   int n;   /* まずは、普通に文字列に */   sprintf(work, "%d", (int)v);   /* お尻からたどり、3桁ごとにカンマを入れながら work → buf へコピー */   s = work + strlen(work);   t = buf;   n = 3;   while (s != work) {     *t++ = *--s;     if (--n == 0 && s != work) {       *t++ = ',';       n = 3;     }   }   *t++ = '\\';   *t = '\0';   /* ひっくり返す */   t = buf;   s = buf + strlen(buf) - 1;   while (t < s) {     char x;     x = *s; *s = *t; *t = x;     --s; ++t;   }   return buf; } int main() {   char buf[256];   printf("%s\n", print_with_comma(buf, 1));   printf("%s\n", print_with_comma(buf, 12));   printf("%s\n", print_with_comma(buf, 123));   printf("%s\n", print_with_comma(buf, 1234));   printf("%s\n", print_with_comma(buf, 12345));   printf("%s\n", print_with_comma(buf, 123456));   printf("%s\n", print_with_comma(buf, 1234567));   printf("%s\n", print_with_comma(buf, 12345678));   printf("%s\n", print_with_comma(buf, 123456789));   return 0; } ポイントは、 ・三桁区切りのカンマは、頭から入れていくと面倒だけど、お尻からいれてゆくと、  それほど面倒じゃない。 ・すでにある文字列に何かを挿入するのは面倒だけど、一文字ずつコピーしながら  適当なときに余計な文字(カンマ)を入れるのは、そんなに面倒じゃない ということですね。

653
質問者

お礼

すぅすごいですね。ありがとうございます。 実際に実行してみました。 お願いした通りでした(笑) ありがとうございました。

関連するQ&A

  • C言語でchar配列の追加

    C言語について質問させていただきます. unsigned char send_data[]; 上記の配列の double d1 = 15.23; double d2 = 14.21; double d3 = 20.56; 上記3つのdouble変数を間に , を入れて連結して代入したいと考えています. 結果はsend_data = "15.23,14.21,20.56"となってほしいです. ポインターなどを使用すれば上記は実現できますでしょうか? お分かりになられる方がいらっしゃいましたら,何卒ご教授よろしくお願い致します.

  • C#で配列の値をチェックするメソッドを書きたい

    C#の配列についてお教え頂けませんでしょうか? CSVファイルから1行読取り、配列に格納しています。 string[] rowdata; string x; int y; double z; TextFieldParser Parser = new TextFieldParser(FILEPATH, Encoding.GetEncoding("shift_jis")); while (!Parser.EndOfData) { //1行読取り rowdata = csvParser.ReadFields(); //読み取った値を変数に x = rowdata[0]; //string y = rowdata[1]; //int z = rowdata[2]; //double } rowdata[0~3]を変数に格納する前に、データのチェックをおこないたいです。 例えば、rowdata[1]はint型変数に格納されます。しかしrowdata[1]に格納された値が「A1」とあった場合、int型変数yには格納できずエラーが起こります。 よって、rowdata[1]に数値以外の文字列があったら「0」に置き換えるなどの処理をいれたいです。 なので、配列を受け取ってデータチェックをするメソッドを作りたいと思いますが、どのように作っていいかがわかりません。 1つのメソッドでint、double、stringかどうかの、チェックを行いたいですが、そのようなことは可能なのでしょうか? 下記のように3つメソッドを作って、データをメソッドに渡しチェックを行なうのがいいのでしょうか? string CheckData(string[] arr){}; int CheckData(int[] arr){}; double CheckData(double[] arr){}; やりたい事は、 メソッド(配列を受取る) rowdata[0]が渡された場合、中身はstringかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[1]が渡された場合、中身はintかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[2]が渡された場合、中身はdoubleかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 以上のような事です。宜しくお願い致します。

  • 配列や連想配列について

    言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • ポインター変数名と配列名は同じでよいのでしょうか?

    C言語で int *data; data[0]=0x15; という記述を見ました。 私にはdataはポインター変数名 であり配列名に思えます。 (ポインター変数へポインター定数を代入するには data = data; ???) しかし入門書にはこんな例はありませんでした。 私の解釈とはちがった意味があるのでしょうか? 教えてください。

  • 配列を使わずに、変数名を動的にループで回したい

    配列を使わずに、変数名を動的にループで回したい 大学の課題をやっている途中に思ったことなのですが……。 プログラム中に同じ型の変数p1,p2,p3があり、それぞれの変数にループで同じ処理を施したいと思っています。 しかし、「p(i)」や「("p" + i)」などと、変数どうしを別のものとして認識させようとしても、コンパイラから警告が出て上手くいきません。 配列を使えば、このような処理が出来ることはわかるのですが、使う変数名を指定されてしまっているために、今回は配列を使えません。 出来るか出来ないか、出来る場合は方法を知りたいです。 後、今回はC言語のプログラムで利用出来るかが自分にとっての問題なのですが、C言語以外のこのプログラミング言語なら出来る、とかの情報もこの機会に知りたいです。 お答え出来る範囲でいいので、もしよければ回答お願いします。

  • android-JNIでクラス配列参照方法について

    androidのJNIで関数引数をクラス配列にした場合、C側ではこのポインタをどのようにすれば取得出来るのでしょうか? 一応GetByteArrayElements()を使用してクラス配列の要素数までは取得できましたが、このクラスのポインタの取得方法が出来ません。 ※クラス配列にある変数をC言語側で参照したいと考えております。 (このクラスはC言語の構造体として扱うようにしています)

  • 配列変数のアドレス

    C言語で、配列を宣言した場合、 char a[] = "hoge"; 変数aは初期化された配列の先頭番地を指しているのですが、この時、 変数aの中身も変数aのアドレス(&a)ともに上記の配列の先頭番地になっているようなのですが、 これによって、配列の変数aは読み取り専用で、書き換えられないということにしていると思っていいのでしょうか? ちなみに、 char *p = "fuga"; とした場合は、pと&pのアドレスは異なって、pの中身は書き換えられます。

  • 並べ替えについて教えて下さい

    現在、C言語を勉強しています 現在、読み取り用のファイルからデータを読み取って情報を処理し、別のファイルにその結果を書き込むといったことをしています。 その中で、配列変数を用いた並べ替えに悪戦苦闘しています。 数字を並べ替えるのと、文字を並べ替えるのでは方法が違うとのこと。 そもそも、文字を並べ替えるとはどういうことですか? まだ経験が少ないので、できる限りわかりやすく説明して下さい。 (c言語に使用する言語を使われてもかまいません。)

  • 2次元配列の使い方

    Access 2013 vba メイン画面に、2つのサブフォーム(共に帳票)があり 親→子→孫 となっています。 この時、親、子、孫のレコードを取得して ある書類を作成しエクセルに出力しようとしています。 この場合、親のデータは普通に変数Aに入れて 子のデータは一次元配列B()に入れ 孫のデータは一次元配列C(0)~C(3)に入れたものを、更に子用の一次元配列B1()~B4()に入れるように作りにしようと考えています。 この場合、 子の画面で次の2レコード目に進んだ時、子画面用のB1...B4の配列変数に入れている孫のC(0)~C(3)の配列の中身は、子画面の一レコードと二レコード目では同じものになるのでしょうか。 もし、同じものになるのであれば、この方法は使えないと思っていますが。。。 他に何か良い方法はありますでしょうか。 Accessで、クラスを作って、それを配列変数に入れるとか・・・ よろしくお願いします。

  • C言語 変数型 (*)() の意味を教えて下さい

    C言語で書かれたプログラムを見ていると、変数宣言の部分に double (*f)(); のような形で書かれたものがよく出てきます。 これは、どういうことを意味しているのでしょうか? よろしくお願いいたします。

専門家に質問してみよう