hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
多目的文字列操作モジュール - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

多目的文字列操作モジュール

[hsp3]

多目的文字列操作モジュール

文字列をいろいろ操作するモジュール(予定)。現在は半角<->全角変換のみ。

モジュール

+  mod_strlu.as

コメント

  • 本当は 大文字小文字変換モジュール もこちらに移行したいのですが、いろいろ面倒だったり、統一性がないので今回は見送りました。うまく統合できるという人はお願いします。 -- Irisawa 2007-01-01 (月) 14:35:15
    URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

文字列操作&判定モジュール

Irisawaさんの大文字小文字変換モジュール多目的文字列操作モジュール、 りすとさんのis_digit.hsp?をellerが勝手にまとめたものです。

モジュール

strutil.hspにリネームして保存してください。

filestrutil12.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
-
|
-
|
!
|
-
|
-
|
!
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
// 文字列操作&判定モジュール strutil.hsp(@HSP開発Wiki)
//                                                       2007/12/29 ver. 1.2
// 
// Irisawaさんの大文字小文字変換モジュールと多目的文字列操作モジュール、
// りすとさんのis_digit.hspをellerが勝手にまとめたものです。
 
// 2007/12/26 ver 1.1
//	- splitとjoinを追加。
//	- ファイル名・モジュール名を変更。
// 2007/12/29 ver 1.2
//	- 区切り文字の数が多く、さらに区切り文字で終わる文字列をsplitできなかった不具合を修正。
 
#ifndef __STR_UTIL__
#define global __STR_UTIL__
#module strutil
#uselib "user32.dll"
    #func CharLower "CharLowerA" var
    #func CharUpper "CharUpperA" var
#uselib "kernel32.dll"
    #cfunc LCMapString        "LCMapStringA" int, int, sptr, int, var, int
    #cfunc GetUserDefaultLCID "GetUserDefaultLCID"
    #cfunc IsDBCSLeadByteEx   "IsDBCSLeadByteEx" sptr, sptr
    #const LCMAP_LOWERCASE           0x00000100  ; lower case letters
    #const LCMAP_UPPERCASE           0x00000200  ; upper case letters
    #const LCMAP_SORTKEY             0x00000400  ; WC sort key (normalize)
    #const LCMAP_BYTEREV             0x00000800  ; byte reversal
    #const LCMAP_HIRAGANA            0x00100000  ; map katakana to hiragana
    #const LCMAP_KATAKANA            0x00200000  ; map hiragana to katakana
    #const LCMAP_HALFWIDTH           0x00400000  ; map double byte to single byte
    #const LCMAP_FULLWIDTH           0x00800000  ; map single byte to double byte
    #const LCMAP_LINGUISTIC_CASING   0x01000000  ; use linguistic rules for casing
    #const LCMAP_SIMPLIFIED_CHINESE  0x02000000  ; map traditional chinese to simplified chinese
    #const LCMAP_TRADITIONAL_CHINESE 0x04000000  ; map simplified chinese to traditional chinese
    #const CP_ACP                    0
    #const CP_OEMCP                  1
 
; 文字列を小文字に変換
#deffunc Lower var vTarget
    CharLower vTarget : return
 
; 文字列を大文字に変換
#deffunc Upper var vTarget
    CharUpper vTarget : return
 
; Lower の関数版
#defcfunc toLower str sParam, local lTarget
    lTarget = sParam : Lower lTarget
    return lTarget
 
; Upper の関数版
#defcfunc toUpper str sParam, local lTarget
    lTarget = sParam : Upper lTarget
    return lTarget
 
; 半角英数字(ASCII 文字)を全角に変換
#defcfunc HanToZen str s1, var v1, int p1
    return LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, s1, -1, v1, p1)
 
; 全角文字を半角英数字(ASCII 文字)に変換
#defcfunc ZenToHan str s1, var v1, int p1
    return LCMapString(GetUserDefaultLCID(), LCMAP_HALFWIDTH, s1, -1, v1, p1)
 
; 全角文字に変換
#defcfunc toZen str sTarget, local lSize, local lBuffer
    lSize = HanToZen(sTarget, lBuffer, 0)
    sdim lBuffer, lSize
    lSize = HanToZen(sTarget, lBuffer, lSize)
    return lBuffer
 
; 半角文字に変換
#defcfunc toHan str sTarget, local lSize, local lBuffer
    lSize = ZenToHan(sTarget, lBuffer, 0)
    sdim lBuffer, lSize
    lSize = ZenToHan(sTarget, lBuffer, lSize)
    return lBuffer
 
; 文字列がすべて半角かどうか
#defcfunc areHan str sParam, local lStat, local lTarget
    lStat = 1 : lTarget = sParam
    repeat strlen(lTarget)
        if IsDBCSLeadByteEx(CP_ACP, peek(lTarget, cnt)) {
            lStat = 0
            break
        }
    loop
    return lStat
 
; 文字列がすべて全角かどうか
#defcfunc areZen str sParam, local lStat, local lTarget
    lStat = 1 : lTarget = sParam
    if strlen(lTarget)\2 : return 0
    repeat strlen(lTarget)/2
        if IsDBCSLeadByteEx(CP_ACP, peek(lTarget, cnt * 2)) == 0 {
            lStat = 0
            break
        }
    loop
    return lStat
 
; 文字列がすべて数字がどうか
#defcfunc areDigit str sParam, local lTarget, local lStat
    lTarget = toHan(sParam) : lStat = 1
    repeat strlen(lTarget)
        if (peek(lTarget, cnt) < '0')|('9' < peek(lTarget, cnt)) {
            lStat = 0
            break
        }
    loop
    return lStat
 
; 文字列がすべて英字かどうか
#defcfunc areAlpha str sParam, local lTarget, local lStat
    lTarget = toLower(toHan(sParam)) : lStat = 1
    repeat strlen(lTarget)
    if (peek(lTarget, cnt) < 'a')|('z' < peek(lTarget, cnt)) {
            lStat = 0
            break
        }
    loop
    return lStat
 
; 文字列の構成要素を調べる
; 戻り値は
; 数字  %00000001
; 英字  %00000010
; その他%10000000
; をorで連結させたものになる
#defcfunc getElement str sParam, local lTarget, local lStat, local lTmp
    lTarget = toHan(sParam) : lStat = 0
    repeat strlen(lTarget)
        lTmp = areAlpha(strmid(lTarget, cnt, 1)) * 2 + areDigit(strmid(lTarget, cnt, 1))
        if lTmp == 0 : lTmp = %1000000
        lStat |= lTmp
    loop
    return lStat
 
; 文字列を指定した桁ずつカンマで区切る(強制的に半角に変換)
#defcfunc _insComma@strutil str sParam, int p1, local lTarget, local lMod, local sRefstr
    if p1 <= 0 : logmes "桁の指定が異常です。" : return ""
    lTarget = toHan(sParam) : lMod = ((strlen(lTarget) - 1) \ p1) + 1
    sRefstr = strmid(lTarget, 0, lMod)
    repeat (strlen(lTarget) - 1)/p1
        sRefstr += "," + strmid(lTarget, cnt * p1 + lMod, p1)
    loop
    return sRefstr
#define global ctype insComma(%1, %2 = 3) _insComma@strutil(%1, %2)
 
// 文字列の分割
// 正常終了時はstatに0が、
// 引数に問題がある場合はstatに1が返る
#deffunc split array arr, str target, str devider
    if devider = "" {
        // 分割する目印は空文字であってはならない
        return 1
    }
 
    dim part_strlen, 10                // 分割結果の長さ
    part_strlen_max = 0                // 分割結果の長さの最大値
    parts_num = 1                    // 分割結果の数
    _target = target                // instr,strmidを使うために変数に代入する
    target_strlen = strlen(target)    // 分割する文字列の長さ
    devider_strlen = strlen(devider)// 分割する目印の長さ
 
    // いくつに分割できるか調べる
    repeat
        ins = instr(_target, cnt, devider)
        if ins == -1 {
            part_strlen(parts_num - 1) = target_strlen - cnt
            if part_strlen_max < part_strlen(parts_num - 1) {
                part_strlen_max = part_strlen(parts_num - 1)
            }
            break
        } else {
            part_strlen(parts_num - 1) = ins
            if part_strlen_max < part_strlen(parts_num - 1) {
                part_strlen_max = part_strlen(parts_num - 1)
            }
            parts_num++
            continue cnt + ins + devider_strlen
        }
    loop
 
    // 分割結果代入用の配列を確保
    sdim arr, part_strlen_max + 1, parts_num
 
    // 分割の開始
    position = 0
    foreach arr
        arr(cnt) = strmid(_target, position, part_strlen(cnt))
        position += part_strlen(cnt) + devider_strlen
    loop
    return 0
 
// 文字列の結合
// 正常終了時はstatに0が、
// 引数に問題がある場合はstatに1が返る
#deffunc join var result, array target, str connecter
    if vartype(target) != 2 {
        // 結合する配列変数は文字列型でなければならない
        return 1
    }
 
    connecter_strlen = strlen(connecter)
    // 連結結果の長さを調べる
    result_strlen = connecter_strlen * (length(target) - 1)
    repeat length(target)
        target_strlen(cnt) = strlen(target(cnt))
        result_length += target_strlen(cnt)
    loop
 
    // 連結結果代入用の変数を確保
    sdim result, result_length + 1
 
    // 連結の開始
    position = 0
    foreach target
        if cnt {
            poke result, position, connecter
            position += connecter_strlen
        }
        poke result, position, target(cnt)
        position += target_strlen(cnt)
    loop
    return 0
 
#global
#endif  ; end of __STR_UTIL__

命令・関数の説明

Lower str
文字列を小文字に変換し、システム変数refstrに返します。
Upper str
文字列を大文字に変換し、システム変数refstrに返します。
toLower(str)
文字列を小文字に変換して返します。
toUpper(str)
文字列を大文字に変換して返します。
toZen(str)
文字列を全角に変換して返します。
toHan(str)
文字列を半角に変換して返します。
areZen(str)
文字列がすべて全角ならば1を、半角を含むならば0を返します。
areHan(str)
文字列がすべて半角ならば1を、全角を含むならば0を返します。
areDigit(str)
文字列がすべて数字ならば1を、数字以外を含むならば0を返します。
areAlpha(str)
文字列がすべて英字ならば1を、英字以外を含むならば0を返します。
getElement(str)
文字列の構成要素を調べます。戻り値は数字を含む場合は%00000001、英字を含む場合は%00000010、それ以外を含む場合は%10000000をそれぞれor演算で連結したものになります*1
insComma(str, int)
文字列を指定した桁(省略時は3桁)ずつカンマで区切って返します。強制的に半角に変換されます。
split(array, str, str)
文字列p2を文字列p3ごとに分割し、配列変数p1に代入します。
join(var, array, str)
文字列型配列変数p2を結合し、変数p1に代入します。結合箇所には文字列p3を挿入します。

動作サンプル

追加検討中の機能

ご自由に編集してください。モジュール自体の更新ももちろん大歓迎いたします(古いバージョンは名前を変えて添付してください)。

  • 文字列の文字数を取得(半角・全角考慮)

コメント

  • うまく統合できていれば良いのですが。 -- eller 2007-06-01 (金) 10:30:00

*1 用語の使い方が間違っているかもしれません
添付ファイル:
filestrutil12.hsp
366件 [詳細]
filestrutil_sample.hsp
341件 [詳細]
filestrutil.hsp
139件 [詳細]
filesCtrlSample.hsp
199件 [詳細]
filesCtrl.as
216件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-12-29 (土) 10:11:16 (2171d)