プログラムで商品の価格を扱う場合には、整数値で保持している価格を三桁ごとのカンマ区切りの文字列変換したい場合が良くある。
1000 ¥1,000 123456 ¥123,456
などだ。
C#の場合にはどうすれば出来るのかなあと思って調べてみたら、簡単に出来た。
でも良く忘れるので備忘録としてこの記事に残しておく。
テスト環境は以下の通り。
- Windows 10 x64 Professional
- Visual Studio 2017 Community
- .Net Frameworkバージョン 4.6.2
- C#コンソールプロジェクト
まあ、.NET Frameworkの古いバージョンでも実行出来るとは思うが、テストはしていない。
整数を三桁ごとのカンマ区切りの文字列に変換する方法
C#で適当に書いてみた。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 今日覚えたCSharpの小技ConsoleApp { class Class1_整数を三桁のカンマ区切りにする { public static void test1() { var priceArr = new int[] { 123456789, 33333, 1, -123, -33333, }; foreach (var price_i in priceArr) { var priceFormatted = "¥" + string.Format("{0:N0}", price_i); Console.WriteLine("{0,20} {1,-20}", price_i, priceFormatted); } } } } /* 【説明】 {0:N0} price_i を三桁のカンマ区切りにして、小数点以下の桁数は0桁(小数点以下は出力しない) {0:N} price_i を三桁のカンマ区切りにして、小数点以下の桁数は2桁(デフォルトは二桁のようだ) {0,20} price_i を20桁の右詰で出力 {1,-20} priceFormatted を20桁の左詰で出力 【実行結果】 123456789 ¥123,456,789 33333 ¥33,333 1 ¥1 -123 ¥-123 -33333 ¥-33,333 */
まあ、要点は、
string.Format("{0:N0}", price_i);
とするだけだ。
string.Format()関数を使って整数文字列をカンマ区切り形式に変換する
要するに、string.Format()関数を使ってprice_i 文字列をカンマ区切り形式に変換するのだ。
その際、書式設定をする事が出来る。
{0:N0} は、price_iを三桁のカンマ区切りにして、小数点以下の桁数は0桁(小数点以下は出力しない) {0:N} は、price_iを三桁のカンマ区切りにして、小数点以下の桁数は2桁(デフォルトは二桁のようだ)
Console.WriteLineで文字列を出力する
そのようにカンマ区切り形式に加工した文字列をConsole.WriteLineで出力している。
{0,20} price_i を20桁の右詰で出力 {1,-20} priceFormatted を20桁の左詰で出力
となる。
さて、余談ではあるがワテの場合、forループは foreach ではなくて for(int i=0; の形式をよく使う。
理由は、今何番目の要素を処理しているのかが知りたい場合があるからだ。
で、foreachループの場合にもindexの値を取得する方法があるか調べてみたら、一応あった。
こんな風にすると出来る。
foreachループの中でインデックスの数字を使う小技
foreach (var item in priceArr.Select((price_i, i) => new { price_i, i })) { var i = item.i; var p_i = item.price_i; var priceFormatted = "¥" + string.Format("{0:N0}", p_i); Console.WriteLine("i={0} {1,20} {2,-20}", i, p_i, priceFormatted); }
まあ、無理矢理にLINQでindexの変数 i を作り出している感じ。
その実行結果は以下の通り。
i=0 123456789 ¥123,456,789
i=1 33333 ¥33,333
i=2 1 ¥1
i=3 -123 ¥-123
i=4 -33333 ¥-33,333
確かに、インデックスの数字が取得出来た。
でもまあ、こんな小細工をするくらいなら、普通にこうするべきだろうなあ。
for (int i = 0; i < priceArr.Length; i++) { var p_i = priceArr[i]; var priceFormatted = "¥" + string.Format("{0:N0}", p_i); Console.WriteLine("i={0} {1,20} {2,-20}", i, p_i, priceFormatted); }
まあ、ワテの場合、繰り返しになるがforループはこのスタイルが好きだ。
さらに余談になるが、List<T> のデータに対しては LINQ の ForEach() と言うのが使える。
今処理しているデータ priceArr は配列なので ToList() でリストにしてやると、こんな感じか。
priceArr.ToList().ForEach(price_i => { var priceFormatted = "¥" + string.Format("{0:N0}", price_i).PadRight(20); Console.WriteLine("{0,20} ->{1}<-", price_i, priceFormatted); });
実行するとこんな感じ。最初の結果と同じだ。
123456789 ->¥123,456,789 <-
33333 ->¥33,333 <-
1 ->¥1 <-
-123 ->¥-123 <-
-33333 ->¥-33,333 <-
では、この ForEach() でもインデックスの数字を使いたい場合にはどうすればいいのかな?
出来るのかな?
いや、そんなヘンテコな事を考えるくらいなら、普通に for(int i=0; のループを使えばいいだろ。
あまりヘンテコな事を考えて脇道に逸れていると、前に進まないから要注意だ。
もしヘンテコな事を考えるにしても、どのループを使うかなどと言う低レベルな次元の話題ではなくて、もう少し高度な話題に関して新しいアイディアなどを閃くように努力したい。
まとめ
ワテの備忘録として、C#で整数を三桁ごとのカンマ区切り文字列に変換する方法を紹介した。
良く忘れるが、要点としては “{0:N0}” あるいは “{0:N}” で可能だ。
Nの右の数字は、小数点以下の桁数を指定出来る。
さらに、余談としてforeachループの中でインデックスの数字を作り出す小細工を紹介した。
まあ、あまりお勧めはしない。
と言う事で、今回の結論は、forループは
for (int i = 0; i < priceArr.Length; i++) { ... }
の形式を使うのが一番だ。
C#の本を読む
独習C#は有名だ。
第3版なので、かなりのロングセラーである。人気が高い証拠だ。
最新のC#4.0に対応しているので、これからC#を勉強予定の人にはお勧めしたい。
704ページもあるので、ワテの場合は、多分途中で挫折すると思うが、前途有望な皆さんには是非読破して頂きたい。
この本は、アマゾンのレビューの評価も高い。
著者も
WINGSプロジェクト (著), 土井 毅 (著), 高江 賢 (著), 飯島 聡 (著), 高尾 哲朗 (著), 山田 祥寛 (監修)
と言う事で有名な人ばかりだ。
でもワテはまだ買っていない。ワテもこう言うちゃんとした教科書を買って勉強してみるかな。
ちなみに、この三冊はアマゾンでは、「よく一緒に購入されている商品」と出ている。
まあアマゾンさんが言うのだから間違いは無いだろう。
コメント