ちょっとした用事で算用数字から漢数字を作成する方法を考えていていました。自作することは難しくなさそうなのですが、  Visual Studio International Feature Pack 2.0 に含まれる InternationalNumericFormatter が使えそうだったので使用してみました。 今回使用する InternationalNumericFormatter は .NET 4.0 でも使用できました。

検証環境

  • Visual Studio 2012 Professional
  • .NET 4.5, コンソールおよびWPFプログラム

1. サンプルコンソールプログラム

コンソールプロジェクトを作成し、参照の追加で、InternationalNumericFormatter.dll を追加します。

InternationalNumericFOrmatter.dllは既定では次のパスにインストールされています。
C:\Program Files (x86)\Microsoft Visual Studio International Feature Pack 2.0\NumericConversion にインストールされています。

あとは既定で作成されるProgram.cs を次のように編集します。

    using System.Globalization;
    using Microsoft.International.Formatters;
    class Program
    {
        static void Main(string[] args)
        {
            // サポートされているのは兆の位まで
            decimal v = 1234567898765432.12345m;
            System.Console.WriteLine("既定:{0}", v);
            System.Console.WriteLine("標準書式(L):{0}", InternationalNumericFormatter.FormatWithCulture("L", v, null, CultureInfo.CreateSpecificCulture("ja")));
            System.Console.WriteLine("基本書式(Ln):{0}", InternationalNumericFormatter.FormatWithCulture("Ln", v, null, CultureInfo.CreateSpecificCulture("ja")));
            System.Console.WriteLine("音訳書式(Lt):{0}", InternationalNumericFormatter.FormatWithCulture("Lt", v, null, CultureInfo.CreateSpecificCulture("ja")));

            System.Console.ReadLine();

           
        }
    }

実行すると次のように漢数字に変換された文字列が出力されます。

2.IValueConverter 内で使用してWPFの画面に表示する

ValueConverter を自作して WPF画面でも漢数字で出力してみます。WPFプロジェクトを作成して、、InternationalNumericFormatter.dll へのdll参照を追加します。次のクラスを作成します。サンプルではInternationalNumeriConverter.cs というファイルを作成しました。


using Microsoft.International.Formatters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace IFPack.Wpf
{
    class InternationalNumericConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string format = parameter as string;
            if (format == null)
            {
                format = "L";
            }
            return InternationalNumericFormatter.FormatWithCulture(format, value, null, culture);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
    }
}

既定で作成される MainWindow.xaml を編集して TextBlock に数字から漢数字に変換した文字列を表示します。

<Window x:Class="IFPack.Wpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:IFPack.Wpf"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525" SizeToContent="WidthAndHeight">
    <Window.Resources>
        <local:InternationalNumericConverter x:Key="kansujiConv"></local:InternationalNumericConverter>
        <sys:Int64 x:Key="testvalue">123456789012</sys:Int64>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Label Grid.Column="0" Grid.Row="0" Content="既定"></Label>
        <TextBlock  Grid.Column="1" Grid.Row="0"  Text="{Binding Source={StaticResource testvalue}}"></TextBlock>
        <Label Grid.Column="0" Grid.Row="1" Content="基本書式(L)"></Label>
        <TextBlock  Grid.Column="1" Grid.Row="1"  
                    Text="{Binding Source={StaticResource testvalue}, Converter={StaticResource kansujiConv}, ConverterParameter=L, ConverterCulture=ja}">
        </TextBlock>
        <Label Grid.Column="0" Grid.Row="2" Content="標準形式(Ln)"></Label>
        <TextBlock  Grid.Column="1" Grid.Row="2"  
                    Text="{Binding Source={StaticResource testvalue}, Converter={StaticResource kansujiConv}, ConverterParameter=Ln, ConverterCulture=ja}">
        </TextBlock>
        <Label Grid.Column="0" Grid.Row="3" Content="音訳書式(Lt)"></Label>
        <TextBlock  Grid.Column="1" Grid.Row="3"  
                    Text="{Binding Source={StaticResource testvalue}, Converter={StaticResource kansujiConv}, ConverterParameter=Lt, ConverterCulture=ja}">
        </TextBlock>
        <Label Grid.Column="0" Grid.Row="4" Content="IMEテスト"></Label>
        <TextBox Grid.Column="1" Grid.Row="4" InputMethod.PreferredImeState="On" InputMethod.PreferredImeConversionMode="Katakana"></TextBox>
    </Grid>
</Window>

実行すると次のようになります。

3. まとめ

説明は以上です。InternationalNumericFormatter を使用するだけで算用数字から関数字に変換できます。サポートされているのは兆の単位までのようですが要件が満たせる場合、簡単に利用できて便利です。

時間があったら数値から漢数字に相互変換するプログラムでも作ってみようかと思います。