• ベストアンサー

全角を半角に変換するがうまくいかない

https://webllica.com/change-double-byte-to-half-width/ を使って全角の数値や英数で回答されても 半角に変換して正解にするクイズを作りたいのですが、全角を入れると偽のほうが実行されてしまいます。 https://codepen.io/anon/pen/gKmgNQ インスペクタで確認したところ、全角の1を入力すると半角の1に変換されるように見えるのになぜでしょうか? まさか文字列と数値の問題かと思い==と二つにしても変わりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5072/13251)
回答No.1

inputAnswer は文字列型の変数ですから value などというプロパティは存在しません。 判定を if (inputAnswer === '1') { とすれば望まれているような判定結果になります。

mousugusokoni
質問者

お礼

確かにそのまま入力した値を変数に入れずに判定する場合はvalueをつけても大丈夫ですが一度valueの値を変数に入れた場合はvalueをつけてはいけなかったですね。 確認してみます。

mousugusokoni
質問者

補足

https://webllica.com/change-double-byte-to-half-width/ で確認してみました。 Aをaにする機能はないようですね。あくまで全角のAを半角のAにするだけのようですね。

その他の回答 (4)

  • t_ohta
  • ベストアンサー率38% (5072/13251)
回答No.5

> if (inputAnswer == 1)となっていました。おかげさまで数値はうまくいきました。ただaとここにいれて > 入力欄にAと入れてもうまくいきませんがこれは数値だけではないはずですよね。 「if (inputAnswer == 'A')」であれば入力欄に「A」と全角大文字のエーを入れれば「真」と判定されますが、入力欄に「a」と全角小文字のエーを入れても大文字と小文字は違う文字ですから「偽」と判定されます。 アルファベットの大文字、小文字を正規化して判定したい場合は「inputAnswer.toLowerCase()」として小文字に統一して判定するか、「inputAnswer.toUpperCase()」として大文字に統一して判定するしかありません。

mousugusokoni
質問者

お礼

inputAnswer.toLowerCase()として返り血を変数に入れて判定すればAをaに変換できるのですね。やってみます。ありがとうございました。

  • t_ohta
  • ベストアンサー率38% (5072/13251)
回答No.4

> 入力された文字列で真偽判定したいのは、inputAnswer.value === '1'のほうです。ここに12345とどの数値を閲覧者さんが入力したかを判定して、 > 例えば1を入力してほしい場合は1を入力してくれたら真をそれ以外の数値や文字列なら偽を実行したいということです。 その趣旨は理解していますが、「if (inputAnswer === '1') {」の前に「if (randomNum === 0) {」と言う判定が入っていますので、こちらが「真」にならない限り「inputAnswer」の中身は判定されません。 なので、先の回答に書いた通り私の手元では「if (randomNum === 0) {」と言う判定を省いて実行した所、意図した通りの動作をしました。

mousugusokoni
質問者

お礼

確かにわかりずらいので下記のみでお考えいただいた方がいいですね。 if (inputAnswer.value === '1') { } else { } それでは下記であればどんな環境でも全角で1と入力されてもちゃんと半角に変換されてちゃんと真になるということですね。 https://codepen.io/anon/pen/BVdgwp 私の環境だとならないのはいったいなぜだと思いますか? 私の記憶違いでしょうか?

mousugusokoni
質問者

補足

if (inputAnswer == 1)となっていました。おかげさまで数値はうまくいきました。ただaとここにいれて 入力欄にA と入れてもうまくいきませんがこれは数値だけではないはずですよね。 別質問が良ければそうします。

  • t_ohta
  • ベストアンサー率38% (5072/13251)
回答No.3

> 数値を入力しても、文字列に変換されていると言う事でしょうか? 全角の数字はプログラミング言語では「数値」では無く「文字列」として扱われます。 toHalfWidth() 関数内では受け取った文字列を一文字ずつ文字コードを取り出し、全角半角のコードの差の分を計算して半角文字の文字コードを導き出し、文字コードを文字に変換するという処理をしていますから、戻り値は文字列です。 > のように変更して、大文字の1を入力して確認しても偽が出てしまいます。 まだおかしいでしょうか? > それともここは正しいので、ここにない部分の問題でしょうか? 公開されていない部分で何をしているか判らないので randomNum 変数の中身が何なのか判断できないので、「if (randomNum === 0)」がどのように判定されるか分かりません。 ここが「真」になっていると仮定して ========== var Answerhalf = "1"; var inputAnswer = toHalfWidth(Answerhalf); if (inputAnswer == 1) { document.write("TRUE"); } else { document.write("FALSE"); } /** * 全角から半角への変革関数 * 入力値の英数記号を半角変換して返却 * [引数] strVal: 入力値 * [返却値] String(): 半角変換された文字列 */ function toHalfWidth(strVal){ // 半角変換 var halfVal = strVal.replace(/[!-~]/g, function( tmpStr ) { // 文字コードをシフト return String.fromCharCode( tmpStr.charCodeAt(0) - 0xFEE0 ); } ); // 文字コードシフトで対応できない文字の変換 return halfVal.replace(/”/g, "\"") .replace(/’/g, "'") .replace(/‘/g, "`") .replace(/¥/g, "\\") .replace(/ /g, " ") .replace(/~/g, "~"); } ========== として実行したら「TRUE」が表示されました。

mousugusokoni
質問者

お礼

うまく伝わっておらずに恐縮です。 入力された文字列で真偽判定したいのは、inputAnswer.value === '1'のほうです。ここに12345とどの数値を閲覧者さんが入力したかを判定して、 例えば1を入力してほしい場合は1を入力してくれたら真をそれ以外の数値や文字列なら偽を実行したいということです。 if (randomNum === 0) { if (inputAnswer.value === '1') { } else { } }

mousugusokoni
質問者

補足

var Answerhalf = "1(全角)";を例の関数で変換してから判定するとちゃんと半角になっているならもしかするとinputタグに入力してもらうPCやスマホの1が数値となるからなのでしょうか? >>> 全角の数字はプログラミング言語では「数値」では無く「文字列」として扱われます。 ただこれを見ると、入力欄に入力してもらった1は、必ず文字列の1として利用されると考えるべきなのでしょうか? すると入力者がどんな環境で入力しても数値ではなく文字列になっているのでこの可能性は0なんですかね?

  • t_ohta
  • ベストアンサー率38% (5072/13251)
回答No.2

> 確かにそのまま入力した値を変数に入れずに判定する場合はvalueをつけても大丈夫ですが input タグをJavaScriptで取得した場合は単純な変数では無くオブジェクトインスタンスですからプロパティ名を指定しないと値は取り出せないので、「valueをつけても大丈夫」なのでは無く「valueをつけてる必要がある」です。 貴方が作った toHalfWidth() 関数は戻り値として文字列型の変数を return しているので、inputAnswer 変数は単純な文字列型の変数になります。 扱っている変数の中身がどんなモノなのか正しく認識してコーディングしないとプログラムは正しく動きません。

mousugusokoni
質問者

お礼

数値を入力しても、文字列に変換されていると言う事でしょうか?

mousugusokoni
質問者

補足

その後 https://codepen.io/anon/pen/BVdgwp のように変更して、大文字の1を入力して確認しても偽が出てしまいます。 まだおかしいでしょうか? それともここは正しいので、ここにない部分の問題でしょうか?

関連するQ&A

  • 全角を半角に変換するがうまくいかない

    https://webllica.com/change-double-byte-to-half-width/ を使って全角の数値や英数で回答されても 半角に変換して正解にするクイズを作りたいのですが、全角を入れると偽のほうが実行されてしまいます。 https://codepen.io/anon/pen/gKmgNQ インスペクタで確認したところ、全角の1を入力すると半角の1に変換されるように見えるのになぜでしょうか? まさか文字列と数値の問題かと思い==と二つにしても変わりません。

  • エクセル:全角⇔半角変換

    エクセルで半角(全角)で打った英数文字を全角(半角)に 「一括変換」する手順を教えてください。

  • 半角・全角の変換できない

    キーボードの左上の「全角・半角変換」キーを押しても、A(直接入力) か 下線とA(半角英数)が交互に変わるだけです。以前のようにタスクバーに「あ」になりません。 タスクバーの「A]をクリックいしてプルダウンメニューの選択でひらがなに転換はできます。  「全角・半角変換」キーを押してひらがな(全角)、英数字(半角)を切り替えるにはどうしたらよいか教えてください。よろしくお願いします。

  • Excelで半角カナのみを全角に変換したい

    EXCELで、半角カナのみを全角に変換する方法はありますか? JISという関数がありますが、これは英数まで全角に変換されてしまいます。

  • 全角英数字を半角に変換

    テキスト文章で ひらがなと全角英数字の文章がありますが、 全角英数と句読点のみ半角に変換したいのですが、 なにか簡単にできる方法はないでしょうか? osはwindows98です。

  • 半角の数値を全角に変換

    半角の数値を全角に変換することは可能でしょうか? ご存知のかたよろしくお願いします。

  • JSがうまくいかない

    クリックするたびにポイントが10加算されるようにしたかったのですが、なぜかクリックするとNANになってしまいます。 codepen上ではうまく再現できていないですが、ソースを張っておきました。 https://codepen.io/anon/pen/oWbvEe?editors=0001 またインスペクタで確認してNanだったのですが、codepenはインスペクタのようにソースを見る機能はないのですか?

  • 半角/全角

    半角/全角のキーを押すと、半角英数入力とひらがな入力とが変換できていたと思うんですが、今は、直接入力とひらがな入力の切り替えになっています。どうすれば元に戻せますでしょうか。

  • 全角と半角を統一する関数

    エクセルの関数で、半角英数文字・全角英数文字や、半角カタカナと全角カタカナが混じっている表で、全角に変換して統一できるような関数や方法があれば教えてください。

  • キーボードでの「英数(全角/半角)」変換

     言語変換関係の質問は、「言語バー」「キーボード」関係で、多数あるのですが、どれが自分の探している症状なのか分からないので、新しく質問します。  PCはSOTECのWV2150Cで、OSはWindowsXPで、ローマ字入力しています。  キーボードによる、「英字和字」変換と、「英字の全角・半角」変換が、自分の意図しない変換に、どういうわけか、時々変わってしまいます。言語バーをマウスでクリックするのは面倒なので、キーボードで操作したいのですが、それが、コントロール不能になってしまうわけです。  具体的には、まず「英字の全角」と「和字の全角」の相互変換ですが、うまくいっているときは、通常和字にしているときキーボードの「英数・CapsLock」を押すだけで「英字全角」に変換できます。また押せば、元に戻せます。しかし、何かの拍子で、このキーを押すと、「英字の半角」になってしまい、どうしても「英字の全角」になりません。しかし、時間が経って、いつのまにか、相互変換できるように戻っていることもしばしばです。  「英字の半角」はキーボード上部の「半角/全角」キーで「英字半角」と「和字全角」とが相互変換できるので、「英数・CapsLock」キーでは、「和字全角」と「英字全角」の相互変換を維持したいわけです。というより、このキーの操作を、どちらも使えるよう、自分でコントロールしたいわけです。  自分でコントロールするためには、「英数・CapsLock」キーを押すと、何かの拍子で、「英字全角」になったり「英字半角」になったりする、その「何かの拍子」が分かればいいと思うのですが、それが、分かりません。  PCの種類によって、キーボード操作は違うのかもしれませんが、一つ、よろしくお願いいたします。

専門家に質問してみよう