HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0329
シュウ【教えてください】文字列中の数字のみを取り出す方法11解決


シュウ

リンク

2011/3/29(Tue) 22:47:49|NO.38003

下記の様なモジュールを作ったのですが、intと利用しているの当たり前なのですが、
文字列中に0を含んでいると0が無視されてしまいます。
何か良い方法はないでしょうか?
ご教授お願いいたします。

//--------------------------------------------------------------------------
#module
//GetNmu:文字列中の数字のみを連結して引数として返す。
//入力文字列はJIS形式のみ
#deffunc GetNum var p1, str p2
sdim buf1,1000
sdim buf2,1000

cnvstow buf1 ,p2//Unicode化

repeat
buf2 = wpeek(buf1, cnt * 2)
if buf2 = 0 : break//終端文字列判
//mes int(cnvwtos(buf2))//intの返り値が0であれば数字ではない。
if int(cnvwtos(buf2)) ! 0 : p1 = p1 + int(cnvwtos(buf2))
loop
return
#global
//--------------------------------------------------------------------------



この記事に返信する


ひらまる

リンク

2011/3/29(Tue) 23:24:36|NO.38004

なんでこんなに複雑に書いているのかはわかりませんが、

if int(cnvwtos(buf2)) ! 0
の部分を、

if int(cnvwtos(buf2)) ! 0 && cnvwtos(buf2) ! "0"
で良いのではないでしょうか。



ひらまる

リンク

2011/3/29(Tue) 23:25:41|NO.38005

すいません間違えましたとち狂ってました。

if int(cnvwtos(buf2)) ! 0 || cnvwtos(buf2) == "0"
ですね;



Cookies

リンク

2011/3/29(Tue) 23:47:03|NO.38007

根本の質問ですが、なんでUnicode化したんですか?



ookenn

リンク

2011/3/29(Tue) 23:49:36|NO.38008

それはint("数字以外の文字")だっても0を返すし
int("0")であったとしてももちろん0を返すからです
対策としてはif文に一つ条件を付けたして
以下のようにしてみるとうまくいくかと
ちなみに
GetNum a,"今日は11月10日"
mes a
としたところと結果が返ってきましたが
これは文字の中に含まれている数字の合計を返すものなのですか?
てっきり数字を取り出して上の場合だと1110
となる感じかと思い込んでいました

#module //GetNmu:文字列中の数字のみを連結して引数として返す。 //入力文字列はJIS形式のみ #deffunc GetNum var p1, str p2 sdim buf1,1000 sdim buf2,1000 cnvstow buf1 ,p2//Unicode化 repeat buf2 = wpeek(buf1, cnt * 2) if buf2 = 0 : break//終端文字列判 if int(cnvwtos(buf2)) ! 0 or cnvwtos(buf2)=="0" : p1+=int(cnvwtos(buf2)) loop return #global



たんす

リンク

2011/3/30(Wed) 02:07:02|NO.38009

「入力が全角のみとして、数字だけを並びを変えずに列挙する関数」を書いてみました。

#module #deffunc GetNum var p1,str p2 sdim inputstr:inputstr=p2 sdim temp dim instr_pos sdim chk_text,20:chk_text="0123456789" //抜き出したい文字の集合 repeat strlen(inputstr)/2 //全角のみとして第二パラメータの文字数分繰り返す tmp=strmid(inputstr,cnt*2,2) //第二パラメータから全角一文字を抜粋 instr_pos=instr(chk_text,0,tmp) //抜き出したい文字集合に含まれるか否か if instr_pos>=0:p1+=tmp //該当文字に含まれるならば第一パラメータに追加 loop return #global // sdim a:a="" sdim b:b="今日は03月29日です。" mes "入力:"+b GetNum a,b mes "出力:"+a
全角半角入り混じってるのは頭沸きそうなので自分には無理です。



info

リンク

2011/3/30(Wed) 03:11:04|NO.38010

基本的に文字の順番は。文字コード(数値)の順番と等しくなっています。
文字 の 0 〜 9 は
文字コードの 48 〜 57
または '0' 〜 '9' と等しくなります。

よって以下の様に文字コードの判別をする事が出来ます。


string = "今日は年03月30日" ret = "" repeat strlen(string) c = peek(string,cnt) // 1byte切り出す if ( c >= '0' and c <= '9') { ret += strf("%c",c) //文字コードを文字へ変換 } loop mes ret



p、USAGI

リンク

2011/3/30(Wed) 03:26:08|NO.38011

>infoさん
その方法だと全角文字の2バイト目のコードが48 〜 57の場合もヒットするかと。



p、USAGI

リンク

2011/3/30(Wed) 05:35:39|NO.38012

知ってるかもしれませんが、一応。
>コードが129〜159か、224〜252の範囲にある場合は、
>次の1バイトと合わせて1文字の全角コードとなる。
これを参考に。



シュウ

リンク

2011/3/30(Wed) 08:47:41|NO.38013

皆さん、早速のご回答ありがとうございます。
お恥ずかしながら、数日ほど悩んでいたので大変助かりました。

ひらまる、ookennさんの回答で解決いたしました。

infoさん、p、USAGIさんの文字コードによる判別も大変参考なりました。

>Cookiesさん Unicode化は全角半角混在時に対応する為です。



小手伝い

リンク

2011/3/30(Wed) 21:47:04|NO.38019

>その方法だと全角文字の2バイト目のコードが48 〜 57の場合もヒットするかと。

シフトJISでは、全角文字の2バイト目が、

!"#$%&'()*+,-./0123456789:;<=>?

と同じ(コード32〜63)にならないように
定められています。



p、USAGI

リンク

2011/3/31(Thu) 18:12:13|NO.38024

>小手伝いさん
そうなんですね、失礼しました。



ONION software Copyright 1997-2023(c) All rights reserved.