ゲームの獲得ポイントやクリア回数など、数値が累積されて大きな値になる可能性があるとき、
sprintf(str, "%d", value);
では、4桁以上でもカンマが入らないので、読みにくくなります。
このページ、および開発関連ページは、PC向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。
投稿 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 ループでコードを短くできそうですが、今は追及しないでおきます。
おすすめ記事はありません。