なんかダメ出しされたので、元の数字を整数ではなく実数or文字列で指定して、
無量大数まで対応させましたよ。
(例によってパパッとやったので不具合あるかもしれませんが、ご容赦を)
//・num2kanf(%1,%2) %1は実数。%2を省略するか0にした場合は、小数部を「○・一二三」という形で、
// %2を0以外にした場合は小数部を「一分二厘三毛」という形にする。
//・num2kans(%1,%2) %1は"123.456"といった文字列の形で指定する。あとはnum2kanfと同じ。
#module
#define global ctype num2kanf(%1,%2=0) _num2kans(str(%1),%2)
#define global ctype num2kans(%1,%2=0) _num2kans(%1,%2)
#defcfunc _num2kans str _st0,int swi
st0=_st0
st0=strtrim(st0,0,' ')
if strlen(st0)=0 {
if swi : return "零" : else : return "〇"
}
if strmid(st0,0,1)="-" : s="マイナス" : else : s=""
st0=strtrim(st0,0,'-')
split st0,".",st1,st2 //st1は整数部、st2は小数部
st1_l=strlen(st1) : if st1_l>72 : st1=strmid(st1,-1,72) : st1_l=72 //整数部は最大72桁(千無量大数の位)
st2_l=strlen(st2) : if st2_l>24 : st2=strmid(st2,0,24) : st2_l=24 //小数部は最大24桁
//整数部分
sn="","","二","三","四","五","六","七","八","九"
lr="千","百","十","" //小さい桁
hr="無量大数","不可思議","那由多","阿僧祇","恒河沙","極","載","正","澗","溝","穣","[禾予]","垓","京","兆","億","万",""
//大きい桁。穣と垓の間の「じょ」は環境依存文字なのでこういう形に。
a=72-st1_l
lr_x=a\4 //小さい桁の位置
hr_x=a/4 //大きい桁の位置
flag=0 //0の時は「億」や「万」を書く必要はなし
flag2=0 //整数部分を出力したフラグ
repeat st1_l
a=limit(peek(st1,cnt)-48,0,9) //"0"のアスキーコードは48なので
if a {
s=s+sn(a)+lr(lr_x)
if (lr_x=3)&(a=1) : s=s+"一"
flag=1
flag2=1
}
lr_x++
if lr_x>3 {
if flag : s=s+hr(hr_x)
flag=0
lr_x=0
hr_x++
}
loop
if (flag2=0)&(swi=0) : s="〇"
//小数部
flag=0 //小数点以下に数値が存在するフラグ
s0=""
if swi {
sn="","一","二","三","四","五","六","七","八","九"
lr="分","厘","毛","糸","忽","微","繊","沙","塵","埃","渺","漠","模糊"
lr(13)="逡巡","須臾","瞬息","弾指","刹那","六徳","虚空","清浄","阿頼耶","阿摩羅","涅槃寂静"
//小数部の単位をWikipediaで調べたら「要出典」ついてたけど、まあいいや
repeat st2_l
a=limit(peek(st2,cnt)-48,0,9) //"0"のアスキーコードは48なので
if a {
s0=s0+sn(a)+lr(cnt)
flag=1
}
loop
if (flag2=0)&(flag=0) : return "零"
if (flag=1)&(flag2=1) : s=s+" ト "
s=s+s0
} else {
sn="","一","二","三","四","五","六","七","八","九"
repeat st2_l
a=limit(peek(st2,st2_l-1-cnt)-48,0,9) //右から調べる
if a {
s0=sn(a)+s0
flag=1
} else {
if flag : s0="〇"+s0
}
loop
if flag : s=s+"・"+s0
}
return s
#global