|
> No.713[元記事へ]
漢数字に変換する関数を拡張させていただきました。
p=5 として、12億3456万7800という形式を付加しました。
また、小数の漢数字変換もできるようにしました。
!アラビア数字(1,2,3,…)を漢数字(一,二,三,…)に変換する NumberString2$(x,p)(Excel準拠ではない)
!アラビア数字小数部(.123…)を漢数字(一分二厘三毛…)に変換する NumberString3$(x,p)(独立して利用可)
LET n1$="〇一二三四五六七八九" !漢数字
LET f1$="千百十 " !位
LET f2$="垓京兆億万 " !4桁ずつの位
LET n2$="〇壱弐参四伍六七八九" !大字
LET f3$="阡百拾 " !位
LET f4$="垓京兆億萬 " !4桁ずつの位
LET n3$="0123456789" !数字
DIM ff$(25)
FOR i=1 TO 25
READ IF MISSING THEN EXIT FOR : ff$(i)
NEXT i
!DATA 割,分,厘,毛,糸,忽,微,繊,沙,塵,埃,渺,漠,模糊,逡巡,須臾,瞬息,弾指,刹那,六徳,虚空,清浄,阿頼耶,阿摩羅,涅槃寂静 !割合表記
DATA 分,厘,毛,糸,忽,微,繊,沙,塵,埃,渺,漠,模糊,逡巡,須臾,瞬息,弾指,刹那,六徳,虚空,清浄,阿頼耶,阿摩羅,涅槃寂静 !本来表記
!"埃"以降は諸説あり
FUNCTION NumberString2$(x,p) !アラビア数字(1,2,3,…)を漢数字(一,二,三,…)に変換する
IF x<0 THEN
PRINT "非負ではありません。"; x
STOP
ELSE
LET w$=""
SELECT CASE p
CASE 1 !漢数字で表記する
LET a=INT(x) !!
IF a=0 THEN
LET w$="〇"
ELSE
LET i=LEN(f2$)
DO UNTIL a=0 !上位の数字がなくなるまで
LET aa=MOD(a,10000) !「…兆億万 」の4桁ずつ
IF aa<>0 THEN
LET ww$=f2$(i:i)
IF ww$<>" " THEN LET w$=ww$&w$
LET k=LEN(f1$)
DO UNTIL aa=0 !各「千百十 」の位
LET ww$=f1$(k:k)
IF ww$=" " THEN LET ww$=""
LET t=MOD(aa,10) !一の位から
IF t=0 THEN !ゼロ・サプレス
ELSEIF k<LEN(f1$) AND t=1 THEN !1・サプレス
LET w$=ww$&w$
ELSE
LET w$=n1$(t+1:t+1)&ww$&w$
END IF
LET aa=INT(aa/10) !次へ
LET k=k-1
LOOP
END IF
LET a=INT(a/10000) !次へ
LET i=i-1
LOOP
END IF
CASE 2 !大字の漢数字で表記する
LET a=INT(x) !!
IF a=0 THEN
LET w$="〇"
ELSE
LET i=LEN(f4$)
DO UNTIL a=0 !上位の数字がなくなるまで
LET aa=MOD(a,10000) !「…兆億万 」の4桁ずつ
IF aa<>0 THEN
LET ww$=f4$(i:i)
IF ww$<>" " THEN LET w$=ww$&w$
LET k=LEN(f3$)
DO UNTIL aa=0 !各「千百十 」の位
LET ww$=f3$(k:k)
IF ww$=" " THEN LET ww$=""
LET t=MOD(aa,10) !一の位から
IF t=0 THEN !ゼロ・サプレス
!!!ELSEIF k<LEN(f3$) AND t=1 THEN !1・サプレス
!!! LET w$=ww$&w$
ELSE
LET w$=n2$(t+1:t+1)&ww$&w$
END IF
LET aa=INT(aa/10) !次へ
LET k=k-1
LOOP
END IF
LET a=INT(a/10000) !次へ
LET i=i-1
LOOP
END IF
CASE 3 !数値をそのまま漢数字で表記する
LET a=INT(x) !!
IF a=0 THEN
LET w$="〇" !!
ELSE
DO UNTIL a=0 !上位の桁がなくなるまで
LET t=MOD(a,10)+1 !一の位から
LET w$=n1$(t:t)&w$
LET a=INT(a/10) !次へ
LOOP
END IF
CASE 4 !十,百,千,万などを漢数字で表記する
LET a=INT(x) !!
IF a=0 THEN
LET w$="0" !!
ELSE
LET i=LEN(f2$)
DO UNTIL a=0 !上位の数字がなくなるまで
LET aa=MOD(a,10000) !「…兆億万 」の4桁ずつ
IF aa<>0 THEN
LET ww$=f2$(i:i)
IF ww$<>" " THEN LET w$=ww$&w$
LET k=LEN(f1$)
DO UNTIL aa=0 !各「千百十 」の位
LET ww$=f1$(k:k)
IF ww$=" " THEN LET ww$=""
LET t=MOD(aa,10) !一の位から
IF t=0 THEN !ゼロ・サプレス
ELSEIF k<LEN(f1$) AND t=1 THEN !1・サプレス
LET w$=ww$&w$
ELSE
LET w$=n3$(t+1:t+1)&ww$&w$
END IF
LET aa=INT(aa/10) !次へ
LET k=k-1
LOOP
END IF
LET a=INT(a/10000) !次へ
LET i=i-1
LOOP
END IF
CASE 5 !! 兆,億,万などを漢数字で表記する
LET a=INT(x)
IF a=0 THEN
LET w$="0"&w$
ELSE
LET i=LEN(f2$)
DO UNTIL a=0 !上位の数字がなくなるまで
LET aa=MOD(a,10000) !「…兆億万 」の4桁ずつ
IF aa<>0 THEN
LET ww$=f2$(i:i)
IF ww$<>" " THEN LET w$=ww$&w$
DO UNTIL aa=0 !各「千百十 」の位
LET t=MOD(aa,10) !一の位から
LET w$=n3$(t+1:t+1)&w$
LET aa=INT(aa/10) !次へ
LOOP
END IF
LET a=INT(a/10000) !次へ
LET i=i-1
LOOP
END IF !!
CASE ELSE
END SELECT
IF x<>INT(x) THEN !!
IF INT(x)=0 THEN
LET w$=""
ELSEIF p=1 OR p=2 OR p=4 THEN
LET w$=w$&"・"
END IF
LET w$=w$&NumberString3$(FP(x),p) ! 小数部変換
END IF !!
LET NumberString2$=w$ !結果を返す
END IF
END FUNCTION
!続く
|
|