アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語を勉強し始めに、計算ソフトを作成しています。
計算結果を3桁区切(例:100,000,000)にしたいのです。

HPを探していろいろ検索してみたりしたのですが、見つからなくて相談する事にしました。(桁区切やC言語などで検索したりしました)

アドバイスお願いします。

A 回答 (6件)

昔作ったもので負数対応版です。


一応動作確認して下さいね。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* numformat1(char* , char* );
char* numformat2(long, char*, int);
char* numformat3(long, int);

int main()
{
static char num[] ="-2147483648";
static char num10[]="-1234567890";
static char num9[] ="-123456789";
static char num8[] ="12345678";
static char num7[] ="-1234567";
static char num6[] ="123456";
static char num5[] ="-12345";
static char num4[] ="1234";
static char num3[] ="-123";
static char num2[] ="-12";
static char num1[] ="-1";

char wk[20];


printf( "in:[%s]-->ot:[%s]\n", num , numformat2( atol(num) , wk, 11 ) );
printf( "in:[%s]-->ot:[%s]\n", num10, numformat2( atol(num10), wk, 10 ) );
printf( "in:[%s]-->ot:[%s]\n", num9 , numformat2( atol(num9), wk, 9 ) );
printf( "in:[%s]-->ot:[%s]\n", num8 , numformat2( atol(num8), wk, 8 ) );
printf( "in:[%s]-->ot:[%s]\n", num7 , numformat2( atol(num7), wk, 7 ) );
printf( "in:[%s]-->ot:[%s]\n", num6 , numformat2( atol(num6), wk, 6 ) );
printf( "in:[%s]-->ot:[%s]\n", num5 , numformat2( atol(num5), wk, 5 ) );
printf( "in:[%s]-->ot:[%s]\n", num4 , numformat2( atol(num4), wk, 4 ) );
printf( "in:[%s]-->ot:[%s]\n", num3 , numformat2( atol(num3), wk, 3 ) );
printf( "in:[%s]-->ot:[%s]\n", num2 , numformat2( atol(num2), wk, 2 ) );
printf( "in:[%s]-->ot:[%s]\n", num1 , numformat2( atol(num1), wk, 1 ) );

puts("---------------------------------------\n");

return 0;
}


/****************************************************************
*
* 関数名 numformat
*
* 機 能 char* で与えられた10進数文字列に対し、3桁ごとにカンマ
* を付加する
*
* 引 数 char* instr : 変換元の10進数文字列へのポインタ
* char* otstr : 変換後の10進数文字列へのポインタ
*
* 返却値 char* : 変換後の10進数文字列へのポインタ
*
* 作成日 2000-05-12
*
*
*****************************************************************
*/


char* numformat2(long n, char* s, int w)
{
int k = 0; /* 桁数カウント用 */
int sign; /* 符号 */
long j = n; /* 桁チェック用 */
char *p, *q;

sign = n < 0 ? -1 : 1; /* 符号をチェック */
do k++; while (j /= 10); /* 桁数をカウント */
k += (k - 1) / 3 + (sign < 0); /* カンマの個数と負号(-)の分を加える */
w = max(w, k); /* 指定された幅と実際に必要な幅の大きいほう */

if(!(p = malloc(w+1))) return NULL; /* 出力用バッファの確保 */
memset(p, ' ', w ); /* すべてをスペースで埋ておく */
q = p + w; /* 後ろから詰め込む */
*q-- = '\0'; /* 文字列にする */

k = 3;
do {
if (k-- == 0) {
*q-- = ','; /* 3桁ごとにカンマを挿入 */
k = 2; /* 桁のカウンタをリセット */
}
*q-- = (char)(labs(n % 10) + '0'); /* 下位の桁から数字をセット */
} while (n /= 10); /* 下位の桁を切り詰め、0になるまで */
if (sign < 0)
*q = '-';
strcpy(s, p);
free(p);
return s;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
試してみます。
勉強し始めで、のろのろしか進んでいませんががんばります!

お礼日時:2006/05/29 16:08

昔、作った事がありましたので記載します。


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

char* numformat(char* , char* );

/*******************************/
/* この main() はテスト用です */
/*******************************/
int main()
{
static char num10[]="1234567890";
static char num9[] ="123456789";
static char num8[] ="12345678";
static char num7[] ="1234567";
static char num6[] ="123456";
static char num5[] ="12345";
static char num4[] ="1234";
static char num3[] ="123";
static char num2[] ="12";
static char num1[] ="1";

char wk[20];

printf( "in:[%s]-->ot:[%s]\n", num10, numformat(num10, wk));
printf( "in:[%s]-->ot:[%s]\n", num9 , numformat(num9 , wk));
printf( "in:[%s]-->ot:[%s]\n", num8 , numformat(num8 , wk));
printf( "in:[%s]-->ot:[%s]\n", num7 , numformat(num7 , wk));
printf( "in:[%s]-->ot:[%s]\n", num6 , numformat(num6 , wk));
printf( "in:[%s]-->ot:[%s]\n", num5 , numformat(num5 , wk));
printf( "in:[%s]-->ot:[%s]\n", num4 , numformat(num4 , wk));
printf( "in:[%s]-->ot:[%s]\n", num3 , numformat(num3 , wk));
printf( "in:[%s]-->ot:[%s]\n", num2 , numformat(num2 , wk));
printf( "in:[%s]-->ot:[%s]\n", num1 , numformat(num1 , wk));

return 0;
}


/****************************************************************
*
* 関数名 numformat
*
* 機 能 char* で与えられた10進数文字列に対し、3桁ごとにカンマ
* を付加する
*
* 引 数 char* instr : 変換元の10進数文字列へのポインタ
* char* otstr : 変換後の10進数文字列へのポインタ
*
* 返却値 char* : 変換後の10進数文字列へのポインタ
*
* 作成日 2000-05-12
*
*
*****************************************************************
*/

char* numformat(char* instr, char* otstr)
{
char* pin = instr;
char* pot = otstr;
unsigned intinlength = strlen(instr);
unsigned intotlength = inlength + (inlength - 1)/3 + 1;
unsigned inti, j;

for( i = j = 1; i <= inlength; i++, j++)
{
if( ((i-1) % 3) ) {
} else {
pot[otlength-j] = ',';
j++;
}
pot[otlength-j] = pin[inlength-i];
}

pot[otlength-1] = '\0';
return(otstr);
}
    • good
    • 0

標準的な方法としては、適切なロケールに設定した際に、localeconv関数が返すlconv構造体のthousands_sepフィールドが","になっていれば、printfなどで3桁区切りがカンマになるはずです。


ただし、これに対応している処理系はほとんどないと思います。

ちなみに、C++であれば、

std::cout.imbue(std::locale(""));

としてから標準出力に数値を書き込めば、3桁区切りが出力されることが多いようです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
いろいろ調べながら進めていきたいとおもいます。
思い通りのものができればいいなーと がんばります!

お礼日時:2006/05/29 16:10

#2 ですが


#include <ctype.h>
を追加
if(i != 0 && i % 3 == 0){ //3桁毎に','を挿入

if(isdigit(*p) && i != 0 && i % 3 == 0){ //3桁毎に','を挿入
に修正
    • good
    • 0

サンプルを作ってみました


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

char *commaFormat(char *outbuf, char *num){
int len, i ;
char *periodp;
char *p;
char *outp = outbuf;

len = strlen(num);
p = num + len -1; //文字列の最後の文字
periodp = strchr(num, '.'); //ピリオドの位置を探す

if(periodp != NULL){
while(periodp<=p){
*outp++=*p--; // ピリオドまでコピー
}
}
for(i=0;num <=p && *p != ' ';i++){ //先頭あるいはスペースになるまでコピー
if(i != 0 && i % 3 == 0){ //3桁毎に','を挿入
*outp++ = ',';
}
*outp++=*p--;
}
*outp='\0';
strrev(outbuf);

return outbuf;
}

int main(void){
char buff[32];
char num[32];

sprintf(num, "%ld", 100000000L);//数値の書式はメインでやる
printf("%s\n", commaFormat(buff, num));

sprintf(num, "%#18.12g", 100000000.99);//小数がある場合
printf("%s\n", num);
printf("%s\n", commaFormat(buff, num));//数値の前の空白は捨てられる

return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはり、そのためのプログラムを書かないとだめだったのですね。

早速試してみたいと思います。

お礼日時:2006/05/26 22:00

Cの標準関数としては無いと思うので、


文字列に変換して、3桁毎出力バッファに,を挿入していくようなプログラムを作ることになると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています