.NET TIPS

数値を4けた区切りの文字列に変換するには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2007/07/26

 数値を文字列に変換する際に、桁(けた)数を容易に判別できるように、3桁置きに「,」という区切り文字を挿入することが多々ある。例えば「1234567」という数値は、次のように3桁ごとに区切られる。

1,234,567

 数値からこのような3桁区切り文字列を作成する方法を、「TIPS:数値を3けた区切りの文字列に変換するには?」で紹介した。3桁区切りは日本や欧米で一般的な数値表現だが、現実の日本円の単位は4桁ごとに万→億→兆と繰り上がるので、4桁ごとに区切ってほしいという要望も少なくはないだろう。そこで本稿では4桁区切りにする方法について紹介する。

 本稿でも、前掲のTIPSと同じくString.Formatメソッドを活用することで、数値から4桁区切り文字列を作成する。しかし、今回はこのString.Formatメソッドの挙動をカスタマイズすることになる。

 String.Formatメソッドの書式指定項目に桁区切り記号「,」を指定すると、数値を文字列化する際に、“3”桁の「数値グループ」ごとに、“,”という「桁区切り文字」が挿入されるわけだが、この数値グループと桁区切り文字はカルチャに基づき決定されている(.NETアプリケーションでは、ユーザー環境の言語コードの設定、いわゆるカルチャ/ロケールの設定に合わせて適切な表示が行えるように、カルチャという情報を持っている)。例えば日本語環境に対応するカルチャでは、数値グループは“3”桁、桁区切り文字は“,”と定義されている。

 従って、数値グループを“4”桁に設定したカルチャを、現在のカルチャに置き換えれば、String.Formatメソッドの出力が自動的に4桁区切り文字列になるわけである。

 まずはカルチャを自作する。具体的には、CultureInfoクラス(System.Globalization名前空間)のインスタンスを作成する。

 カルチャ(=CultureInfoオブジェクト)は、次の2つのプロパティから、取得/設定することが可能だ(ThreadはSystem.Threading名前空間に所属するクラス)。

CultureInfo.CurrentCultureプロパティ(読み取り専用)
Thread.CurrentThread.CurrentCultureプロパティ

 本稿では、(現在のスレッドの)現在のカルチャをコピーして、まったく同じ内容のカルチャを利用することにする。これにはCultureInfoオブジェクトのCloneメソッドを呼び出せばよい。メソッドの戻り値で、現在のカルチャの複製(=クローン)が取得できる。

 次に、新規に作成したカルチャの数値グループを“4”桁に設定する。数値グループの桁数の設定は、カルチャ(=CultureInfoオブジェクト)のNumberFormat.NumberGroupSizesプロパティ*1で設定できる。このプロパティの型は、int型(Integer型)の配列である。従って、「4桁ごと」の数値グループにするには、次のように指定すればよい(「ci」は、カルチャすなわちCultureInfoオブジェクト)。

C#:ci.NumberFormat.NumberGroupSizes = new int[] { 4 };
VB:ci.NumberFormat.NumberGroupSizes = New Integer() {4}

*1 NumberFormat.NumberGroupSizesプロパティは、厳密には、NumberFormatプロパティで取得したNumberFormatInfoクラス(System.Globalization名前空間)のオブジェクトのNumberGroupSizesプロパティである。

 最後に、このカルチャ(=CultureInfoオブジェクト)を、(現在のスレッドの)現在のカルチャに設定すればよい。これを行うには、先ほど示した「Thread.CurrentThread.CurrentCultureプロパティ」を利用すればよい(※「CultureInfo.CurrentCultureプロパティ」は読み取り専用のため、使えないことに注意)。

 以上の内容を実装したのが、次のサンプル・プログラムだ。

using System;
using System.Globalization;
using System.Threading;

class Program
{
  static void Main()
  {
    // 変換前の数値
    int number = 123456789;

    // もともとのカルチャをバックアップ
    CultureInfo backup = CultureInfo.CurrentCulture;

    // 現在のスレッドのカルチャを書き換える
    CultureInfo ci =
      (CultureInfo) CultureInfo.CurrentCulture.Clone();
    ci.NumberFormat.NumberGroupSizes = new int[] { 4 };
    Thread.CurrentThread.CurrentCulture = ci;

    // 変換後の文字列
    string str = String.Format("{0:#,0} Bytes", number);
    Console.WriteLine(str);  // 出力:1,2345,6789 Bytes

    // もともとのカルチャを復元
    Thread.CurrentThread.CurrentCulture = backup;
  }
}
Imports System.Globalization
Imports System.Threading

Module Module1

  Sub Main()
    ' 変換前の数値
    Dim number As Integer = 123456789

    ' もともとのカルチャをバックアップ
    Dim backup As CultureInfo = CultureInfo.CurrentCulture

    ' 現在のスレッドのカルチャを書き換える
    Dim ci As CultureInfo = _
      CType(CultureInfo.CurrentCulture.Clone(), CultureInfo)
    ci.NumberFormat.NumberGroupSizes = New Integer() {4}
    Thread.CurrentThread.CurrentCulture = ci

    ' 変換後の文字列
    Dim str As String = String.Format("{0:#,0} Bytes", number)
    Console.WriteLine(str)  ' 出力:1,2345,6789 Bytes

    ' もともとのカルチャを復元
    Thread.CurrentThread.CurrentCulture = backup
  End Sub

End Module
数値を4桁区切りの文字列に変換するサンプル・プログラム(上:C#、下:VB)

 このプログラムを実行すると、確かに「1,2345,6789」のように4桁区切りになることが確認できるだろう。なお上記コードでは、書き換えたカルチャを元の状態に戻すため、もともとのカルチャのバックアップと復元の処理を入れている。End of Article

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:Stringクラス(System名前空間)
使用ライブラリ:Threadクラス(System.Threading名前空間)
使用ライブラリ:CultureInfoクラス(System.Globalization名前空間)
関連TIPS:数値を3けた区切りの文字列に変換するには?

この記事と関連性の高い別の.NET TIPS
数値を3けた区切りの文字列に変換するには?
Windowsフォームを多言語対応にするには?
[ASP.NET AJAX]グローバリゼーション対応を行うには?
文字列を数値に変換するには?
DataGridViewコントロールで数値を3けた区切りで表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間