HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0826
ゆうやん数値から漢数字に変換したい7解決


ゆうやん

リンク

2018/8/26(Sun) 13:01:55|NO.85211

数値から漢数字に変換したいのですが、可能でしょうか?
可能であれば、スクリプトを教えて欲しいです。

漢数字="零","一","二","三","四","五","六","七","八","九","十" mes 漢数字(8)



この記事に返信する


あらや

リンク

2018/8/26(Sun) 14:23:02|NO.85212

どういう形で変換したいのでしょうか?

例えば、「123」を「一二三」にしたいのか、
それとも「百二十三」にしたいのか、これによって少し変わります。

前者の場合なら1桁ずつ変換するだけなので難しくはありません。

後者の場合は少し難しく思えますが、意外と単純です。

switch(もしくはif)を使って
「1」の場合は「一」
「2」の場合は「二」
〜省略〜
「9」の場合は「九」
というような条件分けするだけです。

2桁以上の場合も同じように条件分岐ですが
だいたいのパターンがあるので
桁数を数えるのと、
桁を漢字に変換する(2桁の数値なら「十」、3桁の数値なら「百」...)
という所だけ考えれば自力で出来ると思います。
(ただ少し面倒なだけで……)



余談ですが、どこかの学校であったらしい
「あたえられた数値を平仮名で返すプログラムを考えよ」
というような内容の課題を思い出します。

例)123 → 「ひゃく に じゅう さん」
  321 → 「さん びゃく に じゅう いち」

この課題も同じように条件分けで変換するだけなんですが
ひらがなだと
100→ひゃく
300→さん びゃく(byaku)
600→ろっ ぴゃく(pyaku)
このように場合によって同じ桁でも読み方が変わる場合があるので
漢字に変換するより大変でしょうね。



沢渡

リンク

2018/8/26(Sun) 14:26:31|NO.85213

パパッと作ってみたので、不具合とかあるかもしれませんが。

#module #defcfunc powi int p_a,int p_b //powi(%1,%2)で%1の%2乗を返す。 if p_b<0 : return 0 //powfと異なり整数限定 p_x=1 repeat p_b p_x=p_x*p_a loop return p_x #defcfunc num2kan int _i //整数を漢数字に変換 //メモ:HSPの整数は最大10桁(十億の位) if _i=0 : return "零" if _i<0 : s="マイナス" : else : s="" i=abs(_i) sn="","","二","三","四","五","六","七","八","九" lr="千","百","十","" //小さい桁 hr="億","万","" //大きい桁 lr_x=2 //小さい桁の位置 hr_x=0 //大きい桁の位置 flag=0 //0の時は「億」や「万」を書く必要はなし repeat 10 a=i/powi(10,9-cnt)\10 //左からcnt桁目の数字 if a { s=s+sn(a)+lr(lr_x) if (lr_x=3)&(a=1) : s=s+"一" flag=1 } lr_x++ if lr_x>3 { if flag : s=s+hr(hr_x) flag=0 lr_x=0 hr_x++ } loop return s #global //以下、実行例 mes num2kan(0) mes num2kan(10) mes num2kan(11) mes num2kan(200000000) mes num2kan(-200000000) mes num2kan(234652338) mes num2kan(200002338)



沢渡

リンク

2018/8/26(Sun) 14:27:42|NO.85214

被ってしまいました。失礼。



ゆうやん

リンク

2018/8/27(Mon) 21:21:03|NO.85226

沢渡さんスクリプトありがとうございます。
できれば「兆」までしてほしかったですが。



Velgail

リンク

2018/8/27(Mon) 22:20:30|NO.85229

>できれば兆まで
これをよく見て、どうぞ。
http://www.onionsoft.net/hsp/v33/doclib/hspprog.htm#EXPRESSION



沢渡

リンク

2018/8/30(Thu) 20:33:58|NO.85251

なんかダメ出しされたので、元の数字を整数ではなく実数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



ゆうやん

リンク

2018/9/3(Mon) 19:28:45|NO.85287

おお!沢渡さん、 無量大数まで出せるようにしたんですね!
ありがとうございます!



ONION software Copyright 1997-2021(c) All rights reserved.