数日前、クレジット カード サイトに新しい機能が統合される予定でしたが、ASP サイトでは、銀行に接続するときにクレジット カードの裏面に有効期限があることを誰もが知っていました。 , この情報はデータ処理のために銀行に送信され、ユーザーがクレジットカードの有効期限を音声で入力した後、無用なトラブルを避けるためにシステムが有効期限を判断します。有効期限は1ヶ月以内であってはいけません 入力した年月日が3つのテキストボックスに入っているのと、それを時間に変換するのが面倒だったので、単純に年月日のテキスト内容をintに変換しました。これが背景です。
ここまで言って、ようやく記事の本題に入りましたが、有効期限は2015-09-20となっているので、迷わず月のテキストボックスから「09」を取り出しました。うんちしました。Chromeで次の変換を行いました。とても満足しています。完了しました。
午後、テストした妹が戻ってきて、クレジットカードの有効期限の判定に問題があると言いました。自分のマシンで試しても問題がありました。仕方なく妹の机に行ってオイルを塗って起動してみると、案の定、超常現象が起きた。そして今、ついに問題が見つかりました。
私がテストしていたとき、妹が IE8 をインストールしました。IE8 では、parseint はデフォルトで「09」を 8 進数として扱いましたが、それが正当な 8 進数ではないことがわかり、最終的には誤った値 0 を破棄しました。また、Chrome では「09」がデフォルトで 10 進数として認識されるため、js エンジンはそれを自然に 9 に変換することも確認しました。つまり、IE は人間の常識に従っていないのです。解決します 毛糸?
1: 解決策
<1> 先ほどの議論で、parseInt のデフォルトの動作処理がブラウザごとに異なることもわかりました。 JavaScript API ドキュメントのブラックボックスを調べてみると、驚くべき基数パラメータを見つけました。
この基数がわかれば、図に示すように radix=10 を指定するだけで問題は簡単に解決できます。
しかし、IE9 では、基数が欠落している場合、parseint の最下層もデフォルトで 10 進数になることが後に判明しました。最終的に、Microsoft は一般の人々の好みに合わせて正しい変更を加えました。
<2> parseint 関数に加えて、実際にはこの問題の解決に役立つ Number 関数もあります。IE7 と 8 では問題ありません。その場合、Number オブジェクトを生成できます。これは C# とは若干異なるため、以下の 2 つの方法で見ることができます。
この Number の利点は、10 進数値のみを処理できることであり、文字列パラメーターのみを受け入れる parseint とは異なり、number は次のような任意の型を受け入れることができます。
Number の基礎となるソースコードを見ることができないため、これらの問題は伝聞によってのみ思い出すことができます。これが JS が他のマネージド言語と異なる点です。