文字列を数値配列に変換するサンプル

概要

数値配列である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
      • // do nothing

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
      • // do nothing

テスト実行はこちら
  • action main()
    • // 変換したい文字列
    • var s := "123,$FF,$80,987,$FFFF"
    • // 変換実行
    • var n := code → str2numMap(s)
    • // 変換結果を表示
    • for each x in n
      • where true
    • do
      • // xにはインデックスが入っている
      • x → to string → concat("=") → concat(n → at(x)) → post to wall

events

なし
最終更新:2011年11月16日 16:08