0

私はphpjsという JavaScript ライブラリを使用しています 。目標は、PHP が関数を処理する方法を模倣する関数を作成することです。

特に 1 つの関数を次に示します: http://phpjs.org/functions/is_float:442

私はいくつかのテストケースを書きましたが、すべてが期待どおりです。ただし、これを試すとすべてが壊れます:

document.write(is_float(16.0x00000000));

true または false が画面に表示されることはなく、空の空白のみが表示されます。どうしてこれなの?

私がそれをしている間、その関数でreturn !!(mixed_var % 1); は、ダブルとは何ですか!!と言っています。為に?私は前にこれに遭遇したことはありません。ソース コードで 1 つを除外すると、次のテスト ケースでまったく同じ結果が得られます。私が忘れている可能性のあるケースはありますか?

document.write(is_float(186.31));document.write('<br>');
document.write(is_float("186.31"));document.write('<br>');
document.write(is_float("number"));document.write('<br>');
document.write(is_float("16.0x00000000"));document.write('<br>');
document.write(is_float("16"));document.write('<br>');
document.write(is_float(16));document.write('<br>');
document.write(is_float(0));document.write('<br>');
document.write(is_float("0"));document.write('<br>');
document.write(is_float(0.0));document.write('<br>');
document.write(is_float("0.0"));document.write('<br>');
document.write(is_float("true"));document.write('<br>');
document.write(is_float(true));document.write('<br>');
document.write(is_float("false"));document.write('<br>');
document.write(is_float(false));document.write('<br>');

編集: 0.0 の問題について、これは修正できません。ドキュメントを確認してください。

//1.0 is simplified to 1 before it can be accessed by the function, this makes
//it different from the PHP implementation. We can't fix this unfortunately.

これは、JavaScript が独自に行っていることのようです。プログラマーはこれを制御できません。

4

3 に答える 3

2

16.0x00000000JavaScript では有効な数値式ではありません。16進数値を表現しようとしている場合、適切な表記は0x16(22基数 10) であり、10 進数は使用できません。たまたま科学表記法を使用して値を表現しようとしている場合、適切な表記法は1.632e2( 163.2) です。

!!ブール値に変換するトリックです。!!0と解釈できる を考慮してください!(!0)。最初は になりますがtrue、これはもちろん正確ではありません。次にfalse、 の正しいブール表現に戻り0ます。

于 2009-12-12T23:49:45.020 に答える
1

「0x....」は 16 進数の JavaScript 表記です。ただし、16.0x0000 は意味のあるものとして解釈できません。typeof 16.0x00 が Javascript エラーをスローしています。これは予期されることです。あなたが本当に欲しいものはis_float(0x16)、またはそれに似たものです

入力を検証しているようです。入力されたもの (テキスト フィールドなど) が実際にフロートであることを本当にテストしたい場合は、次のような独自の関数を作成することをお勧めします。

function is_float(input) {
    if (typeof input !== 'string') {
        input = input.toString();
    }
    return /^\-?\d{1,9}\.\d+$/.test(input);
}

is_float("16.0x00"); //false
is_float("16.00");   //true

そうすれば、数値の変換などに対処する必要はありません。

于 2009-12-12T23:53:48.850 に答える
0

構文エラーをスキップするには、try catch に入れてこのように評価するしかないと思います。

try{eval("document.write(is_float(16.0x00000000));")}catch(e){}

しかし、そのような奇妙な方法は、 is_float 関数に try catch を入れて、16.0x00000 ではなく "16.0x00000" のような文字列のみを受け入れることをお勧めします。

于 2009-12-13T02:34:32.847 に答える