このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com
作成日 February 16, 2018、文面整理 November 23, 2019
トップページ > Android 開発トップ > C/C++による数値のフォーマット
line
Android 開発
line

ここでは、C/C++ で、数値(整数)を、3桁ごとにカンマを入れた文字列に変換します。

ゲームの獲得ポイントやクリア回数など、数値が累積されて大きな値になる可能性があるとき、
sprintf(str, "%d", value);
では、4桁以上でもカンマが入らないので、読みにくくなります。
MFC ( Microsoft Foundation Classes、Visual C++ で使いやすいクラス群 ) では、CString クラスがあるのでどうにでもしやすいのですが、C/C++ ではよくわかりません。 もしかすると関数があるのかもしれませんが、新しく作りました。

このページ、および開発関連ページは、PC向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

▼ セクション一覧

数値を3桁ごとにカンマが入った文字列に変換する

以降、必要に応じ追加予定?


数値を3桁ごとにカンマが入った文字列に変換する

投稿 February 16, 2018, 最終更新 July 30, 2018(様式変更)

C/C++ では、ポインタについては安全性の問題が常にあることは、わかっています。

char str[4];
int value = 123456;
sprintf(str, "%d", value);
のようにすれば、メモリの問題が発生します。 sprintf_s のような関数を Microsoft では用意していますが(str のサイズ指定が必要な sprintf 関数)、 STLport に同様の関数があるのかどうか、わかりませんでした。

この問題はおいておいて、

char str[256];
formatValue(str, 123456);
のように呼び出せる関数を作成しました。

もちろん、条件は桁数を確保できる十分なサイズの文字列バッファがあること、になります。 自分で使う関数ですし、ぎりぎりまでバッファを削る必要もありませんから、まあ良しとしています。

ヘッダーファイルで次のように関数を定義しました。

実際には、namespace を使って、text 系の関数に分類しています。

void formatValue(char* str, int value);

次のような関数にしました。

void formatValue(char* str, int value)
{
	char tmp[1024];
	char sec[1024];

	// もともと4桁未満のとき
	if (value < 1000) {
		sprintf(str, "%d", value);
		return;
	}

	// tmp をクリアしておきます。
	sprintf(tmp, "");

	while (1) {

		// 4桁以上あるので、下位3桁を取り出します。
		//    1234567 なら、567 だけフォーマットしています。
		//    tmp の先頭に追加します。
		sprintf(sec, "%s", tmp);
		sprintf(tmp, ",%03d%s", value % 1000, sec);
		value /= 1000;	// 1234567なら 1234 を残します

		// 残りが4桁未満になったとき、先頭に追加します。
		if (value < 1000) {
			sprintf(sec, "%s", tmp);
			sprintf(str, "%d%s", value, sec);
			return;
		}
	}
}

もともと4桁未満なら、sprintf 関数でフォーマットして終了します。

4桁以上なら、下3桁を、あたまに0を付けてフォーマットして、最初にカンマを付けておきます。 残りが3桁以下になったら、それを先頭に付けて終わります。

まだ4桁以上あるときは、同じことを繰り返し、3桁以下になるまでカンマを付けていきます。

こう見ると、do〜while ループでコードを短くできそうですが、今は追及しないでおきます。

▲ページ先頭へ
line
関連トピックス
line

C/C++ による文字列操作 CString を代用

C/C++ で、MFC の CString を代用する、最低限欲しかった機能を持ったクラスを作成しました。

C/C++ による現在日時の取得

C/C++ で現在時刻を取得する方法を検討しています。

C/C++ によるログ出力

C/C++ で、ログファイルを出力する方法について、書いています。

line
その他のおすすめ
line

おすすめ記事はありません。

JavaScriptが無効です
▲ページ先頭へ


© 2017-2021 StraightApps.com 無断転載を禁じます。No reproduction without permission.