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

Android 開発

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

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

ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

数値を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 を代用する、最低限欲しかった機能を持ったクラスを作成しました。

line
その他のおすすめ
line

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

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


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