数字を漢数字に変換する

 数字(整数)のフィールドを漢字で表示する方法についてです。
 単に1→一,2→二…と変換するだけならともかく、千とか万とか億といった単位を挿む必要があるためなかなか面倒です。

方法1:Excelからコピーする方法(NUMBERSTRING関数,TEXT関数)

f:id:accs2014:20160731111030p:plain:right:w400

 Excelの場合はセルの書式に「漢数字」というのがありますし、NUMBERSTRING関数やTEXT関数により文字列として取得することもできます。多数の値を一括して変更するのであれば、これによる出力文字列を取り込むのが正攻法かと思います。
 ただし、1件1件追加していく時には手動で入力した方が早いですし、もとの数字を数値型のフィールドとして別に残しておく必要があるとすれば、同じ内容の列を2つ持つこととなり、ちょっと面白くないかもしれません。


方法2:関数で変換する方法

f:id:accs2014:20160731103646p:plain:right:w200

 ユーザ定義関数を作るのが常道ですが、ここでは組み込み関数でムリヤリなんとかするものとし、16桁(9999兆…)まで対応するようにしてみたいと思います。
 例として右のテーブルの「数字」列(データ型を十進型としており、大きい数字を記録できます)の数字を、クエリ上で漢字に変換してみます。


f:id:accs2014:20160731103647p:plain:right:w400

 クエリデザインの画面で次のような2つの列を設けます。



直変換: IIf([数字] Is Null,Null,Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Right(Format([数字],"0\千0\百0\十0\兆0\千0\百0\十0\億0\千0\百0\十0\万0\千0\百0\十0"),Len([数字])*2-1),0,"零"),1,"一"),2,"二"),3,"三"),4,"四"),5,"五"),6,"六"),7,"七"),8,"八"),9,"九"))

漢数字: IIf([直変換]="零","零",Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Nz([直変換],""),"零千",""),"零百",""),"零十",""),"零",""),"一千","千"),"一百","百"),"一十","十"),"兆億","兆"),"億万","億"),"兆万","兆"))

※ ¥がスラッシュとして表示されているかもしれません。

後者の「漢数字」が求める文字列となります。前者の列は数字を1→一,2→二…と置き換えて間に兆、億、万、千…の文字を挟んだたものです。後者の列では「零百」や「一十」といった不自然な文字列を除き、これにより生じる恐れのある「億万」といった文字列をも除いています。ただ、0に対する処理が冗長ですし、その他にもちょっと無駄がある感じです。

f:id:accs2014:20160731103648p:plain:right:w600

 それはともかくとして出力は右のようになります。なお「一千」という表現を残したい場合は後者の式のうち「,"一千","千")」の部分と「Replace(」のいずれかを削ればOKです。