3

特定の日付が正しい形式であるかどうかをチェックすることになっている関数を作成しようとしています。これを行うと、関数は変数を受け取り、それを年、月、日の3つのサブ変数に分解します。後で、これらの各サブストリングをいくつかのifステートメントでチェックしたいと思います。

GF番号880413でこれを実行すると、year = 88、month = 4、day = 13ですが、自分の番号820922でこの関数を実行すると、関数はyearを82、monthを0に設定しますか? !!そしてday=22。

この可能性はどうですか?月が04の場合は切り捨てられ、4のみが表示されますが、月が09の場合は0に切り捨てられます。

関連するコードは次のとおりです。

function isValidDate(date) 
{
    var valid = true;

    var year = parseInt(date.substring(0, 2));
    var month = parseInt(date.substring(2, 4)); // error here!
    var day = parseInt(date.substring(4, 6));
    alert(year+"--"+month+"--"+day+"--")
}

番号820922を実行したときの出力は次のとおりです(最後の4桁は忘れてください。これらはスウェーデンの社会保障番号用であり、この例では考慮する必要はありません)

ここに画像の説明を入力してください

そして、ここに番号880413の出力があります(ここでも最後の4桁を忘れてください) ここに画像の説明を入力してください

4

5 に答える 5

7

parseInt() を使用するときは常に基数を指定する

これは、指定しない場合、デフォルトで基数 10 にならず、最初の数字/文字に基づいて推測するためです。IE '0' で始まる場合、8 進数として解釈されます。

function isValidDate(date) 
{
    var valid = true;

    var year = parseInt(date.substring(0, 2), 10);
    var month = parseInt(date.substring(2, 4), 10);
    var day = parseInt(date.substring(4, 6), 10);
    alert(year+"--"+month+"--"+day+"--")
}

またはNumber()ieを使用します

var month = Number(date.substring(2, 4));
于 2012-09-10T20:15:02.247 に答える
3

ベースを指定します - parseInt("09", 10) を使用します。従来の理由から、ゼロで始まる数値は 8 進数として解析されます。"8" と "9" は有効な 8 進数ではないため、"09" を整数として正しく解析することはできません。

編集-少し掘り下げて、明らかにあなたがしたことは公式のECMAscript標準に適合しますが、ほとんどの実装ではとにかく8進形式を使用します-詳細はこちら.

于 2012-09-10T20:16:38.557 に答える
1

08の場合も同様の問題が発生します。これは、Javascript が 0 で始まる数値を 8 進数として扱い、8 進数に09orがないため08です。したがって、ベースを 2 番目のパラメーターとして指定できます。

alert(parseInt('08',10));
于 2012-09-10T20:19:56.897 に答える
0

正規表現が役立つ場合があります。

date.replace( /(\d{2})(\d{2})(\d{2})/,'$1--$2--$3--');  
于 2012-09-10T20:27:35.507 に答える
0

文字列を整数と連結すると、04 が得られません。必要な結果を得るには、printf を使用する必要があります。

'%02d--%02d--%02d'.sprintf(year, month, day);

関数 sprintf はプロトタイプ ライブラリからのものです。

于 2012-09-10T20:19:59.613 に答える