桁区切りがある数値

6月 14th, 2017

ユーザーの数値入力を受け付けると、桁区切りが入ってしまっている場合がある。

例えば「1800」は「1,800」と入力されるかもしれない。

。。。パイソン君にどう思う(?)か聞いてみた。

a=’1,800′
str(a)

絶対無理だろうと思ったらやっぱり駄目だった。「変なの入ってる」と言われた。

まあ、そうだよね。次は・・・

a=1,800

苦情を言われるかと思いきや、何故かすんなり通ってしまった。「何だと思った」のか聞いてみた。

答え:タプルでしょ。1と800。

言われて見ればそれもそうだな。やっぱり先に「,」を取り除かないと駄目っぽい。

a=’1,800′
b=int(a.replace(‘,’,”))

これでbに1800という数値が入りました。めでたしめでたし。

・・・とは行かないのがチャットボットの悲しいところ。やみくもに「,」を取ってしまうと、意図しない動作をしかねない。数字の間の「,」限定だと少しましだけど、でも、例えば「1,13,5」(1と13と5)という意味で入力している場合もある。

人間にフレンドリーな設定でプログラムを書こうと思うと、こういう細かい手間がすごく多くて疲れる・・・ユーザーに「数値の場合は桁区切りを使わないで」もしくは「数字の桁区切り以外で、数字を列挙したい時は『,』ではなく『、』を使って」とかやっちゃえばプログラムは簡単になる。でもそれじゃ、チャットボットの値打ちがないと思うんだなぁ・・・

三桁ごとの「,」を外す、という手もあるんだけど、でも「1と800」という意味で「1,800」と入力している場合に問題が起こる。

人間は、その数字が出てくるコンテキスト(背景)から瞬時に判断するけど、コンテキスト理解をプログラムで実行するのは、難易度が高すぎる(多分今もっとも進歩したAIでも、この辺りはまだ全然足りていないはず)。まあ、人間もたまに読み間違うけど。

次善の策で、場面限定で「,」を外すようにすれば、まあそれほど誤作動せずにすむかな・・・

ちなみに、逆に桁区切りを挿入する場合は、下記らしい。

‘{:,}’.format(1234567890)

これで1,234,567,890が得られる。

いたずらしてみた。

‘{:;}’.format(1234567890)

桁区切り指定をセミコロンに。叱られた。

「intに;を使うなんて聞いてない」

ごめん。数値と良く使う記号ならいいかも、と「-」指定にしてみた。

‘{:-}’.format(1234567890)

まんま1234567890が返ってきた。

そうか・・・。formatについて少し調べて見たけど、ちょっと難しくて良く分からない。もうしばらく眺める必要がありそう。

No related posts.

Comments are closed.