アプリ版:「スタンプのみでお礼する」機能のリリースについて

javascript:(function()
{
var ans = prompt("Hello?") ;
ans = parseInt( ans ) ;
alert( ans );
})();

上記のブックマークレットにて、promptの内容に全角の数値を入れると、alertでNaNが表示されるのですが、全角で入力された数字を数値へ変換するにはどうしたら良いですか?

Number関数でも結果は同じでした

A 回答 (3件)

JavaScript の関数 parseInt は、


Unicode ブロック「基本ラテン文字」の文字のみを対象としているので、
Unicode ブロック「半角・全角形」の文字は変換できません。

そのため、
以下の仕様により、文字列から数値 NaN に変換され、
> 第1引数の初めの文字が数値に変換できないときは、parseInt()関数はNaNを返します。
出典: https://developer.mozilla.org/ja/docs/Web/JavaSc …

以下の仕様により、数値から文字列 "NaN" に変換され、画面表示されます。
> 1. If m is NaN, return the String "NaN".
出典: http://www.ecma-international.org/ecma-262/6.0/# …

対策としては、
基本ラテン文字以外で入力される可能性がある数字すべてを、
基本ラテン文字に修正する仕組み用意するのが一般的です。

例) 半角・全角形の数字を修正してから parseInt 変換
var fixNumericChars = (v) => v.replace(/[0-9]/g,v=>"0123456789".indexOf(v));
var n = parseInt( fixNumericChars(ans), 10 );

Unicode には他にも数字が多々ありますので、用途に照らし合わせて修正対象をご検討ください。
https://en.wikipedia.org/wiki/Number_Forms
https://en.wikipedia.org/wiki/Enclosed_Alphanume …
https://en.wikipedia.org/wiki/Ancient_Greek_Numb …
https://en.wikipedia.org/wiki/Cuneiform_Numbers_ …
    • good
    • 0

parseIntは変換できなかった時にNaN(Not a Number)を返却します。


それがalertで文字としてのNaNに変換されて出力されています。
NaNと何かを数値演算を行うといかなる場合もNaNになりますので、何かの値で上書きしてあげない限りalertにはNaNが出力されます。

以下の様な方法で半角文字に変換してからparseIntを行ってください。
■JavaScript 文字列 全角を半角に 半角を全角に変換する方法
http://kazunori-lab.com/uchikikase/?p=955
    • good
    • 0
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます

promptの戻り値は文字列型
parseIntは全角の数字もそのまま通すので、半角への変換は行われない
というのは調べてわかったのですが、alertでの結果がNot a Numberになるのは理解できません

また、promptに全角の文字列を入れ、戻り値に✕1などの演算を入れることで、数値への暗黙の型変換がおこなれるはずですが、それも行われません。
何故ですか

お礼日時:2018/06/03 14:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!