文字列を数値配列に変換するサンプル
概要
数値配列であるNumber Mapは一度に一つのデータしか追加できないようです。
これでは大量のデータを登録する場合に不便なので、カンマ区切りのテキストを分割して数値配列化するというルーチンを作ってみます。
また先に作成してある16進→10進変換も組み合わせて10進数だけではなく16進数にも対応させます。
文字数節約のため16進は"0xFF"ではなく"$FF"のように記述します。
※splitが使えるのでindex ofではなくstrCol := split(",")にした方が高速化できそうです。
データを使った描画の方では修正版を使用しています。
※ver2.4からjsonオブジェクトをwebからダウンロードするというコマンドが追加されました。
大量のデータを扱う場合はそちらの方が簡単です。
"//"で始まるコメント行は入力する必要ありません。
data
actions
hex2binはprivate設定
- action hex2bin(hex:String) returns bin:Number
- // hexが空だったら0を返す
- bin := 0
- if not hex → is empty then
- // hexの"abcdef"を大文字の"ABCDEF"に統一
- var h := hex → to upper case
- // 16進の倍率
- var v := 1
- // hexの文字数の最後の文字から変換開始
- var i := hex → count - 1
- // 変換
- while i ≧ 0 do
- // 文字の判定
- var n := "0123456789ABCDEF → index of(h → substring(i,1)),0)
- // 不正な文字ならとりあえず0ということにする
- if n < 0 then
- n := 0
- else
- // do nothing
- // 文字の数値に倍率をかけて加算
- bin := bin + (n * v)
- // 倍率を次の桁のために16倍する
- v := v * 16
- // 参照する文字を1つ先頭に移動
- i := i - 1
- else
str2numMapはprivate設定
- action str2numMap(str:String) returns nMap:Number Map
- // nMapを初期化
- nMap := math → create number map
- // 一時的な値保管用
- var v := 0
- var l := 0
- // nMap登録用インデックス
- var i := 0
- // str検索用インデックス
- var t := 0
- // strが空じゃなければ処理
- if not str → is empty then
- // 検索ループ
- while t < str → count do
- // strからカンマを検索
- var c := str → index of(",",t)
- if c < 0 then
- // カンマが見つからなかったら文字列の最後を指定
- c := str → count
- else
- // do nothing
- // 数値の文字数
- l := c - t
- // "$"で始まるなら16進数、違ったら10進
- if str → index of("$",t) = t then
- v := code → hex2bin(str → substring(t + 1,l - 1))
- else
- v := str → substring(t,l) → to number
- // nMapに追加してインデックスを更新
- nMap → set at(i,v)
- i := i + 1
- // 次の値を取り出すために文字列インデックスを更新
- t := c + 1
- // 検索ループここまで
- else
テスト実行はこちら
- action main()
- // 変換したい文字列
- var s := "123,$FF,$80,987,$FFFF"
- // 変換実行
- var n := code → str2numMap(s)
- // 変換結果を表示
- for each x in n
- do
- // xにはインデックスが入っている
- x → to string → concat("=") → concat(n → at(x)) → post to wall
events
なし
最終更新:2011年11月16日 16:08