1

私は ajax 経由で数値を読み取るアプリケーションを持っています。数値は 16 進数で、解析して 10 進数に変換します。

数値はワイヤレス シリアル リンク経由で取得され、100% 信頼できるわけではないため、データの処理を開始する前に確認する必要があります。数値は、****025781610403e5****たとえば次のような形式になります。これ****は、私が過去に非 Web ベースのプロジェクトで使用した番号の開始と終了を確認する方法であり、変更される可能性があります。

とにかく、最後に私の質問に: エラー チェックの一環として、テスト中に NaN エラーが発生するため、NaN をチェックすると思っていましたが*1234、正の NaN を指定してもエラーが発生12**34しないのはなぜですか? テストするために他に何ができますか?

ここに私が使用したコードの一部を示します。私は JavaScript にかなり慣れていないことに注意してください。

function readSliceConvert()
{
    functionReadForm()
    testVal = hexString.slice(4,18);
    document.getElementById("battDb4").innerHTML=testVal;
    testNum1 = h2d(testVal)
    document.getElementById("battDb5").innerHTML=testNum1.toString();
    testNum2 = parseInt(testVal);
    document.getElementById("battDb6").innerHTML=testNum2.toString();
    if (isNaN(testNum2))
    {
        errorCount++;
        document.getElementById("battDb3").innerHTML=errorCount.toString();
        document.getElementById("battDb4").innerHTML=testVal;

        return;
    }
}
4

3 に答える 3

3

これは、 を使用しているためですparseInt。文字列の先頭に解析可能な数字がある場合、文字列の末尾にある文字は黙って無視されます。

あなたの関数が何をしているのかわかりませんがh2d、16 進数の文字列を数値に変換し、次に 10 進数形式の文字列に変換してから、数値に戻しているようです。16 進文字列を解析した結果が数値にならない理由がわかりません。

たとえば、次のように、解析が失敗した場合は null を返します。

function h2i(str) {
  var num = 0;
  var digits = "0123456789abcdef";
  str = str.toLowerCase();
  for (var i = 0; i < str.length; i++) {
    var n = digits.indexOf(str.substr(i, 1));
    if (n == -1) return null;
    num = num * 16 + n;
  }
  return num;
}

デモ: http://jsfiddle.net/Guffa/6yAaP/

使用法:

testVal = hexString.slice(4,18);
document.getElementById("battDb4").innerHTML = testVal;
testNum = h2i(testVal)
document.getElementById("battDb5").innerHTML = testNum.toString();
if (testNum == null)
{
  errorCount++;
  document.getElementById("battDb3").innerHTML = errorCount.toString();
  document.getElementById("battDb4").innerHTML = testVal;
  return;
}
于 2012-11-15T20:47:50.717 に答える
0

isNanが壊れているため、奇妙な動作が見られます(詳細については、mozillaのドキュメントを参照してください)。

データが正しくフォーマットされていることをテストするためのより良い方法は、のような簡単な正規表現ですserial.test(/^\d+$/)。これは、シリアル全体が完全に数値でserial.test(/^\*{4}\d+\*{4}$/)ある場合に成功します。または、シリアルが4つのアスタリスク、1つ以上の数字、その後に続く場合に成功します。別の4つのアスタリスク。

更新:@Guffaの答えは正しいので、受け入れる必要がありますが、正規表現でやろうとしていることをよりよく達成できるという有効な議論が全体像にあると思うので、ここに残しておきます。

文字列に対してtestを実行すると、指定された正規表現が実行され、文字列trueと一致する場合は戻ります。

正規表現は、テキストを説明する単なるパターンであり、非常に複雑な場合もあれば、私が示した例のように単純な場合もあります(\d+つまり、数値(\d)を1回以上()一致させ+、アンカーを使用して、の先頭(^)と末尾($)を指定します)。文字列の一部だけでなく、文字列全体を一致させたいことを示す文字列。非常に便利なので、時間をかけてその仕組みの基本を学び、時間の経過とともに知識を広げることはほぼ間違いなく価値があります。すぐに始められるregular-expressions.infoの素晴らしいチュートリアル。

于 2012-11-15T20:46:40.117 に答える
0

parseInt()が何をするか知っていますか?

MDNから

parseIntは最上位の関数であり、どのオブジェクトにも関連付けられていません。

parseInt関数は、最初の引数を文字列に変換して解析し、整数またはNaNを返します。NaNでない場合、戻り値は、指定された基数(基数)の数値として取得された最初の引数の10進整数表現になります。たとえば、基数10は、10進数、8進数、8進数、16進数などから変換することを示します。10を超える基数の場合、アルファベットの文字は9より大きい数字を示します。たとえば、16進数(16進数)の場合、AからFが使用されます。

parseIntは、指定された基数の数字ではない文字を検出すると、それと後続のすべての文字を無視し、その時点までに解析された整数値を返します。parseIntは、数値を整数値に切り捨てます。先頭と末尾のスペースは許可されます。

コンソールでコードを実行します

console.log( parseInt("12**34",10) );  

したがって、parseIntは12を返すため、数値に対してisNaNを実行しています。

最初の文字が*の場合、返される先頭の数字はありません。

console.log( parseInt("*1234",10) );  
于 2012-11-15T21:08:40.853 に答える