過去の桐井戸端BBS (桐ver.9)
22644 文字列を数値に変換する項目計算式ですっきりした式にしたい 今村 誠 2003/10/07-18:32
こんにちは、名案が浮かびません。
良い式があったら教えて下さい。
「2,10」は20に「100,6,10,5」を165
「2,1000,3,100,6,10,8」を2368に
「1000,10,2」は1012になります。

最高で9999までしかありません。
条件選択を考えましたが、条件が大変ですっきりした式が思いつきません。
桐9で項目名は元項目を[1]変換後の項目名は[1数値]としています。
22655 Re:文字列を数値に変換する項目計算式 宮城 2003/10/07-23:44
記事番号22644へのコメント
今村さん、こんばんは。

元のデータを、「a,1000,b,100,c,10,d」形式に揃えろって
いうのはダメなんでしょうねぇ。となると、この形式に揃えるところからやらなくちゃだめか。

(いっそ「a,b,c,d」だけの方が楽ですが。)

22656 計算式のヒントになるかな? エゼル 2003/10/08-00:06
記事番号22644へのコメント
今村 誠さん こんにちはエゼルと申します。

要素数が2個 >「2,10」        は 20  (2*10
要素数が3個 >「1000,10,2」      は1012 (1000+10+2
要素数が4個 >「100,6,10,5」     は165  (100+6*10+5
要素数が7個 >「2,1000,3,100,6,10,8」は2368  (2*1000+3*100+6*10+8

以上の様な感じですよね?例題がもっと多いと解り安いのですが
私ならこの用にするかも?
計算式は時間があれば後ほど掲載しますが今村さんの方が詳しいかも?
方法ヒント
内容は1000の要素位置と100の要素位置と10の要素位置と
その他の文字は1から9までと言うことですよね?
使用する関数は
#対応文字列と
#桁数
#文字位置
でしょうか?
これだけではヒントにならないでしょうか?
では、

22657 Re:文字列を数値に変換する項目計算式 うにん 2003/10/08-00:14
記事番号22644へのコメント
>「2,10」は20に「100,6,10,5」を165
>「2,1000,3,100,6,10,8」を2368に
>「1000,10,2」は1012になります。
>最高で9999までしかありません。

どういう謎々かと思いました(^^;
要するに、読んだままの数値にしたいわけですね。
計算式だと繰り返しをそのまま展開して書かないといけないので長くなってしまいますね。
変数を2つ使ってみました。

#計算(#代入(&合計値,0),#代入(&秒,#対応番号([1],"1000")),#代入(&合計値,&合計値+1000*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48)),#代入(&秒,#対応番号([1],"100")),#代入(&合計値,&合計値+100*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48)),#代入(&秒,#対応番号([1],"10")),#代入(&合計値,&合計値+10*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48)),&合計値+#MOD(#数値([1]),10))

#漢数字の逆関数があると短くできそうなんですが。
素直に左から順に処理したほうが短くなるかな?

22659 みなさんありがとうございました 今村 誠 2003/10/08-00:52
記事番号22644へのコメント
うにんさんこんばんは
>#漢数字の逆関数があると短くできそうなんですが。
>素直に左から順に処理したほうが短くなるかな?

まさにこれをしたかったのです。
変数を使って計算でうまくできればと思っていたのですが………
3項目に割り付けてテストしてみました。
思っていた結果が出てうれしいです。

関数の中に繰り返しが使えるともっと項目数も減ると思うのですが、分解したり合成したり手間がかかります。
一括も考えたのですが、表で出来れば一番簡単なので御願いしました。

宮城さんもエルゼさんもお返事ありがとうございました。
今回はうにんさんからすばらしい計算式を教えていただいたので
これを使用いたします。

また明日どうしてこうなるのか考えます。

うにんさんありがとうございました。
22660 勉強になりました。 エゼル 2003/10/08-01:17
記事番号22657へのコメント
うにんさん こんにちはエゼルと申します。
いつもお世話様です。

答えを見ると驚嘆の一言です。計算式でこんなに短く出来るのですね。びっくりしました。
勉強になりました。
>
>#計算(#代入(&合計値,0),#代入(&秒,#対応番号([1],"1000")),#代入(&合計値,&合計値
>+1000*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48)),#代入(&秒,#対応番
>号([1],"100")),#代入(&合計値,&合計値+100*#COND(&秒<2,&秒,1,#JIS(#対応文字列
>([1],&秒-1))-48)),#代入(&秒,#対応番号([1],"10")),#代入(&合計値,&合計値
>+10*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48)),&合計値+#MOD(#数値
>([1]),10))
>
>#漢数字の逆関数があると短くできそうなんですが。
>素直に左から順に処理したほうが短くなるかな?
>

22664 Re:文字列を数値に変換する項目計算式 うにん 2003/10/08-08:55
記事番号22655へのコメント
宮城さん

>元のデータを、「a,1000,b,100,c,10,d」形式に揃えろって
>いうのはダメなんでしょうねぇ。

なるほど、先に整形すれば例外処理がいらなくなりますね。
[1整形]を作って
#文字置換("0,"+[1],"0,10","0,1,10")
とやっておくと、

#数値(#NVL(#対応文字列([1整形],#対応番号([1整形],"1000")-1),"0")
+#NVL(#対応文字列([1整形],#対応番号([1整形],"100")-1),"0")
+#NVL(#対応文字列([1整形],#対応番号([1整形],"10")-1),"0")+#LAST([1整形],1))
だいぶわかりやすい。

22670 Re:文字列を数値に変換する項目計算式 今村 誠 2003/10/08-11:34
記事番号22657へのコメント
うにんさんこんにちは、式の変更が大変だったので元値も変数に変えました。

#計算(#SET(STR,[1]),#SET(合計値,0)
,#SET(秒,#対応番号(&STR,"1000"))
,#SET(合計値,&合計値+1000*#COND(&秒<2,&秒,1,#JIS(#対応文字列(&STR,&秒-1))-48))
,#SET(秒,#対応番号(&STR,"100"))
,#SET(合計値,&合計値+100*#COND(&秒<2,&秒,1,#JIS(#対応文字列(&STR,&秒-1))-48))
,#SET(秒,#対応番号(&STR,"10"))
,#SET(合計値,&合計値+10*#COND(&秒<2,&秒,1,#JIS(#対応文字列(&STR,&秒-1))-48))
,&合計値+#MOD(#数値(&STR),10))

#JISで数値に変換していますが、#NUMの方が短いように思いました。
#NUMだと全角半角関係なく数値に変えますが、
#JISで全角文字だととんでもない数値になります。
#JISの良いところは何かあるのでしょうか。

すでに300項目使用しており、表定義も計算式を置換して書いているので
「整形」は作らないでこのままで良いです。

#対応文字列に省略文字はないのでしょうか例えば#TBや#TM
等を割り当ててもらえないかな(K3様)
22671 Re:文字列を数値に変換する項目計算式 うにん 2003/10/08-11:57
記事番号22670へのコメント
>うにんさんこんにちは、式の変更が大変だったので元値も変数に変えました。

なるほど、最初の#SETですね。

>#計算(#SET(STR,[1]),#SET(合計値,0)
>,#SET(秒,#対応番号(&STR,"1000"))
>,#SET(合計値,&合計値+1000*#COND(&秒<2,&秒,1,#JIS(#対応文字列(&STR,&秒-1))-48))
>,#SET(秒,#対応番号(&STR,"100"))
>,#SET(合計値,&合計値+100*#COND(&秒<2,&秒,1,#JIS(#対応文字列(&STR,&秒-1))-48))
>,#SET(秒,#対応番号(&STR,"10"))
>,#SET(合計値,&合計値+10*#COND(&秒<2,&秒,1,#JIS(#対応文字列(&STR,&秒-1))-48))
>,&合計値+#MOD(#数値(&STR),10))
>
>#JISで数値に変換していますが、#NUMの方が短いように思いました。
>#NUMだと全角半角関係なく数値に変えますが、
>#JISで全角文字だととんでもない数値になります。

最初にあがった例でうまくいくように作っただけの式なので、こちらの解釈と違うデータが
あればうまくいかない可能性はもちろんあります。(全角文字は全く想定外です)

>#JISの良いところは何かあるのでしょうか。

#JISを使ったのは先頭の1文字だけ数値にするためです。
「1000,100」の場合に100に掛ける数字が1になるようにしています。

という風に、ちょっとわかりづらいですよね。
最初の#SETを[1整形]の式にして、後から投稿した計算式にした方が他に変数が全くいらないのですっきりしてます。
論理も自然ですし。まあ使うほうのお好み(&自己責任)で。

22672 Re:文字列を数値に変換する項目計算式 今村 誠 2003/10/08-12:25
記事番号22671へのコメント
うにんさん詳しい説明ありがとうございました。

>#JISを使ったのは先頭の1文字だけ数値にするためです。
>「1000,100」の場合に100に掛ける数字が1になるようにしています。

#NUMでためしたら整数の項目なので「千」で桁あふれしました。
「千十」は間違った答えになりました。
当然といえば当然ですが(^。^)

22673 Re:文字列を数値に変換する項目計算式 うにん 2003/10/08-13:02
記事番号22670へのコメント
>#計算(#SET(STR,[1]),#SET(合計値,0)

これって本当は「#SET("STR",[1])」と書かないとだめですよね。
(結局#代入より短くならないので#SETはほとんど使ったことないです)

こないだの一括処理のときと違って、変数名には元々演算子などが使えないので
引っかかる可能性は相当低そうですが。

22674 Re:文字列を数値に変換する項目計算式 ケント 2003/10/08-13:31
記事番号22657へのコメント
うにんさん こんにちは

#JISの使い方と1の位の求め方#MOD(#数値…
がとても参考になりました。発想が柔軟なんですね。

私の場合は#文字置換とかで
はじめは

1000,10,2→1000+10+2
100,6,10,5→100+6*10+5
2,1000,3,100,6,10,8→2*1000+3*100+6*10+8

に変換することが出来たのですが,
shift+F9(計算)を手動でするのがどうも…

そこで次に
1012は1a1c2d
165は1b6c5d
2368は2a3b6c8d
にしてから計算する式を作ったのですが,うにんさんの式がスマートなので"没"です。

合計のところは配列変数&計算を使って#配列合計が使えるので
うにんさんの式をお借りすると下記のようになりました。

#計算(
#代入(&秒,#対応番号([1],"1000"))
,#代入(&計算[1],1000*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48))
,#代入(&秒,#対応番号([1],"100"))
,#代入(&計算[2],100*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48))
,#代入(&秒,#対応番号([1],"10"))
,#代入(&計算[3],10*#COND(&秒<2,&秒,1,#JIS(#対応文字列([1],&秒-1))-48))
,#配列合計("計算")+#MOD(#数値([1]),10)
)


22684 Re:文字列を数値に変換する項目計算式 今村 誠 2003/10/08-19:41
記事番号22664へのコメント
うにんさんこんにちは、ちょっと忙しかったので検証を詳しくしたわけではないのですが、
整形すると[1]が未定義値の場合
[1整形]は「0,」が表示されて計算結果[1数字]も「0」が
返されるようです。
漢数字文字列をうにんさんの式で計算した数値を文字に戻すので
未定義値と「0」は区別しないといけないので、最初のお答えがすっきりすると思います。
 条件選択も良いと思いますが、今回は最初の式を使わせていただきたいと思います。

#代入(&と#SET(""は長さが一緒になるので今後は#代入を使用します。
\(__ )

22685 Re:文字列を数値に変換する項目計算式 うにん 2003/10/08-21:21
記事番号22684へのコメント
>整形すると[1]が未定義値の場合
>[1整形]は「0,」が表示されて計算結果[1数字]も「0」が
>返されるようです。

なるほど、未定義も想定外でした。
#COND([1],〜)
にすればいいだけですけどね。整形を横着せず#部分列(〜,3)にしてもいいかも?

>漢数字文字列をうにんさんの式で計算した数値を文字に戻すので
>未定義値と「0」は区別しないといけないので、最初のお答えが
>すっきりすると思います。
> 条件選択も良いと思いますが、今回は最初の式を使わせていただ
>きたいと思います。

あとは京兆億万に対応すれば、#漢数字の逆関数ができますねえ。

戻る