数値を3けた区切りの文字列に変換するには?[C#、VB]:.NET TIPS
金額や容量など、桁(けた)数が長い数値を表現する際、単位が判別しやすくなるように、3桁単位で区切り文字「,」を挿入することがよくある。C#およびVBでString.Formatメソッドを使って実現する方法を解説する。
金額や容量(例:バイト数)など、桁(けた)数が長い数値を画面に表示したり、印刷したりする場合、単位が判別しやすくなるように、3桁単位で区切り文字「,」を挿入することが多々ある。例えば「1234567」という数値は、次のように3桁ごとに区切られる。
1,234,567
.NETプログラミングで数値をこのような3桁区切りの文字列に変換するには、Stringクラス(System名前空間)の静的メソッドFormatを利用すると簡単だ。具体的には、次のようにしてString.Formatメソッドを呼び出す。
String.Format("{0:#,0} バイト", 1234567)
メソッドの第2パラメータに指定している「1234567」は変換前の数値である。実際にはここに任意の数値を指定する。
第1パラメータに指定している文字列内の「{0:#,0}」は、“書式指定項目”と呼ばれ、この指定によって数値が3桁区切りになる*1。なお、(数値から文字列に変換する際の)書式指定項目の書き方について詳しくは「TIPS:数値を右詰めや0埋めで文字列化するには?」を参考にしてほしい(本稿では説明を割愛する)。
*1 逆にいえば{ 〜 }で囲まれていない部分、前述の例でいうと「 バイト」は、そのまま文字列として出力される。
「0:#,0」の意味を簡単に説明しておくと、
「インデックス『0』番目のパラメータ(=Argument)に指定された数値(上記の例では、第2パラメータの「1234567」に該当)を、その整数部分の各数値グループ(=3桁ごとの文字列)の間に桁区切り文字(,)を挿入して文字列に変換する」
という意味になる。
出力文字列で「桁区切り文字(,)の挿入」が実現されるのは、書式指定項目で「桁区切り記号(,)」が指定されているからだ。「,」の前にある「#」は“桁プレースホルダ”、「,」の後にある「0」は“ゼロ・プレースホルダ”と呼ばれるもので、「,」は(単独では使えず)これらいずれかのプレースホルダの“間”に指定しなければならない。そのため、(「,」ではなく)「#,0」という記述になるわけだ(※桁プレースホルダは数字を表示するか何も表示しないことを指定するもので、ゼロ・プレースホルダは数字または「0」を必ず表示することを指定する。つまり、書式指定項目に「#,0」と指定した場合、引数の数値が「0」のときには「0」という文字列が出力されることになる。しかし、「0,0」の場合には「00」と出力され、「#,#」の場合は何も表示されないので注意が必要だ)。
次のサンプル・プログラムは、実際にString.Formatメソッドにより、数値を3桁区切りの文字列に変換する例である。
using System;
class Program
{
static void Main()
{
int number = 9876543; // 変換前の数値
string str = String.Format("{0:#,0} Bytes", number); // 変換後
Console.WriteLine(str); // 出力:9,876,543 Bytes
}
}
Module Module1
Sub Main()
Dim number As Integer = 9876543 ' 変換前の数値
Dim str As String = String.Format("{0:#,0} Bytes", number)
Console.WriteLine(str) ' 出力:9,876,543 Bytes
End Sub
End Module
3桁区切りは日本でも一般的な数値表現だが、現実の日本円の単位は4桁ごとに万→億→兆と繰り上がるので、4桁ごとに区切ってほしいという要望も少なくはないだろう。その方法については、「TIPS:数値を4けた区切りの文字列に変換するには?」を参照していただきたい。
ちなみに、3桁区切りの文字列を右詰めにしたい場合には、本稿で紹介した方法に、「TIPS:数値を右詰めや0埋めで文字列化するには?」の方法を組み合わせればよい(詳細は割愛)。
カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Stringクラス(System名前空間)
関連TIPS:数値を右詰めや0埋めで文字列化するには?
関連TIPS:数値を4けた区切りの文字列に変換するには?
■この記事と関連性の高い別の.NET TIPS
Copyright© Digital Advantage Corp. All Rights Reserved.