|
|
2020/5/30(Sat) 23:19:11|NO.90667
はあるでしょうか?
PC-9801では文字列関数で出来たと思うのですが、HSPではヘルプファイルやプログラミング
書籍を調べても、まだ見つかっていません。
|
|
2020/5/31(Sun) 03:59:41|NO.90670
うわー!これぐらいあるかと思ったら、自力実装なのか!(^^;
とりあえず真相はわかったので、いろいろ工夫とか代償手段を考えてみます。
|
|
2020/5/31(Sun) 09:17:41|NO.90671
ぼーっとしていて、ふと思いつきました!実は今回、半角→全角変換をしたいのは数字だけ
なので(コマンド入力ゲームで能力値を2バイト日本語文字と同時に出力したいため)
1.引数で数字を持ってくる(例:「256」)
2.数字を文字列にして一文字ずつ切り出す(例:「2」「5「6」)
3.2バイト変換用の文字列「0123456789」を持っておき
2の数字とstrmid関数からどの位置を切り出すか相対的に決定する
4.3の結果を出力文字列にためておき、returnで帰り値にする
これで何とか行けそうです。
|
|
2020/5/31(Sun) 11:17:28|NO.90672
LCMapStringを使ったモジュールを作ってみました。
全角/半角の変換の他、ひらがな/カタカナ、大文字/小文字の変換にも対応しています。
#include "kernel32.as"
#module
//mapstr(p1,p2)
//p1の文字列を、p2に指定した変換タイプに従って変換したものを取得する。
//変換タイプには以下の数値を指定する。数値を足すことで同時に指定可能。
// 1:小文字に変換
// 2:大文字に変換
// 4:ひらがなに変換
// 8:カタカナに変換
// 16:半角に変換
// 32:全角に変換
#defcfunc mapstr str _s,int type,local s,local res
s=_s
t=0
if type&1 : t|=0x100 //LCMAP_LOWERCASE 小文字に変換
if type&2 : t|=0x200 //LCMAP_UPPERCASE 大文字に変換
if type&4 : t|=0x100000 //LCMAP_HIRAGANA ひらがなに変換
if type&8 : t|=0x200000 //LCMAP_KATAKANA カタカナに変換
if type&16 : t|=0x400000 //LCMAP_HALFWIDTH 半角に変換
if type&32 : t|=0x800000 //LCMAP_FULLWIDTH 全角に変換
LCMapString 0x800,t,varptr(s),-1,0,0 //LOCALE_SYSTEM_DEFAULT=0x800
if stat=0 : return s
len=stat
sdim res,len
LCMapString 0x800,t,varptr(s),-1,varptr(res),len
return res
#global
//以下、使用例
mes mapstr("256",32)
mes mapstr("0123456789abcdefghijklmnopqrstuvwxyz",34)
mes mapstr("いろはにほへとちりぬるをわかよたれそつねならむ",24)
mes mapstr("ガギグゲゴ",36)
|
|
2020/5/31(Sun) 11:18:55|NO.90673
数字だけを全角にしたいのでしたら、こういう方法も。
#module
//fwidnum(p1)
//p1の文字列の中から、半角の数字を全角に変換して返す。
#defcfunc fwidnum str _s,local s,local temp,local res
s=_s
w=strlen(s)
sdim temp,w*2
c=0
repeat w
x=peek(s,cnt)
if (x>=0x30)&(x<=0x39) {
poke temp,c,0x82
poke temp,c+1,0x1F+x
c+=2
} else {
poke temp,c,x
c++
}
loop
sdim res,c+1
memcpy res,temp,c,0,0
return res
//fwidnum_i(p1)
//p1に指定した整数値を、全角に変換した文字列にして返す。
#defcfunc fwidnum_i int i,local s2
s2=str(i)
return fwidnum(s2)
#global
mes fwidnum_i(256)
mes fwidnum("01234567890ABCDEFGHIJKLMN")
|
|
2020/5/31(Sun) 11:32:21|NO.90674
すみません、NO.90672のコードですが、トラブル回避のためにロケールIDに日本語を
指定するようにしたので、以下のものに置き換えてください。
#include "kernel32.as"
#module
//mapstr(p1,p2)
//p1の文字列を、p2に指定した変換タイプに従って変換したものを取得する。
//変換タイプには以下の数値を指定する。数値を足すことで同時に指定可能。
// 1:小文字に変換
// 2:大文字に変換
// 4:ひらがなに変換
// 8:カタカナに変換
// 16:半角に変換
// 32:全角に変換
#defcfunc mapstr str _s,int type,local s,local res
s=_s
t=0
if type&1 : t|=0x100 //LCMAP_LOWERCASE 小文字に変換
if type&2 : t|=0x200 //LCMAP_UPPERCASE 大文字に変換
if type&4 : t|=0x100000 //LCMAP_HIRAGANA ひらがなに変換
if type&8 : t|=0x200000 //LCMAP_KATAKANA カタカナに変換
if type&16 : t|=0x400000 //LCMAP_HALFWIDTH 半角に変換
if type&32 : t|=0x800000 //LCMAP_FULLWIDTH 全角に変換
LCMapString 0x0411,t,varptr(s),-1,0,0 //日本語のロケールID=0x0411
if stat=0 : return s
len=stat
sdim res,len
LCMapString 0x0411,t,varptr(s),-1,varptr(res),len
return res
#global
//以下、使用例
mes mapstr("256",32)
mes mapstr("0123456789abcdefghijklmnopqrstuvwxyz",34)
mes mapstr("いろはにほへとちりぬるをわかよたれそつねならむ",24)
mes mapstr("ガギグゲゴ",36)
|
|
2020/6/21(Sun) 22:17:19|NO.90830
忘れたころのレスですが(^^;他の部分のプログラミングがうまく行かなかったので
こっちをいじったら、あっさり完成しました。参考としてリスト掲載です。
===
a=256
mes a
mes
b=n1to2(a)
mes b
stop
;↑★呼び出すサンプルプログラム
;↓★呼び出される開発プログラム
#defcfunc n1to2 int la ;数字1→2バイト変換
lr="":ls=str(la):b2="0123456789"
repeat strlen(ls):j=int(strmid(ls,cnt,1)):b3=strmid(b2,j*2,2):lr=lr+b3:loop
return lr
|
|