2012-09-17 6 views
29

私はvalueというパラメータを渡しています。値が浮動小数点かどうかを知りたい はこれまでのところ、私は次のようしている:文字列が浮動小数点数であるかどうかを確認するにはどうすればよいですか?

if (!isNaN(value)) 
{ 
    alert('this is a numeric value but not sure if it is a float.'); 
} 

は、どのように私はさらに一歩進み、フロートに評価することができる何かに文字列を変換するのですか?

+0

'parseFloat'を使ってみてください。 –

+0

'value'はどのように渡されますか?フォームや何かを通して? – 0x499602D2

+0

http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer –

答えて

25

::のような

何か、それは小数点かを使用している場合

if (!isNaN(value) && value.toString().indexOf('.') != -1) 
{ 
    alert('this is a numberic value and I\'m sure it is a float.'); 
}​ 
+2

まあ、9.0は、ほとんどの人のロジックの整数として完全に受け入れられるかもしれませんが、これは正確な答えではありませんが、仕事を終わらせることができます。 – Nelson

+15

-1は一部の国でのみ有効です。多くの場合、千の区切り文字としてピリオドを使用します。ヨーロッパのほとんどは、浮動小数点値のカンマを使用します。 – Keith

32

parseFloat関数を使用できます。

渡された値がfloatの場合、関数は値を返し、そうでない場合はNaNを返します。

このよう
val = parseFloat(val); 
if(isNaN(val)) 
    alert("not a float!"); 
+3

これは私にもっときれいで優雅な解決策に見えます –

+0

これは実際の解決策ではありません。 floatに整数を解析しようとすると、実際には何も起こりません。 – Powerslave

+0

@Powerslave実際にコードを試しましたか?それは動作します – Mangiucugna

0

valueを文字列として渡された場合のみ、我々は完全に決定することができます。 1.0(数値として)はですが、"1.0"(文字列として)の結果は"1.0"と全く同じです。そしてそこから小数点が含まれているかどうかを調べることができます。.したがって、引数valueを文字列として渡す必要があります。 valueが文字列の場合

は次の通りに動作します

if (value.indexOf('.') > -1) { // value is a floating point 

} 

value.toString()1.0"1.0"(むしろ、それは単に1にそれを回すでしょう)ので、文字列で渡すと、最善の選択肢があるためであるには変わりません。すべての文字を維持します。

文字列を使用しない場合は、1.0を浮動小数点値として取り込む方法がありません。あなたはのテストをしたい場合は、以下を使用して、浮動小数点値である:

以下は

if (value >>> 0 !== x) { // value is a floating point 

} 

など、1.0、1.00のために動作しません。注:また、チェックする必要があります!isNaN(value)(私は変更に焦点を当ててそれを残しました)。

5

文字列が整数または浮動小数点

function isFloat(n) { 
    return parseFloat(n.match(/^-?\d*(\.\d+)?$/))>0; 
} 

//alert(isFloat("3.444")); 
5
Number.prototype.isFloat = function() { 
    return (this % 1 != 0); 
} 

次にあなたが2.00のような

var floatValue = parseFloat("2.13"); 
var nonFloatValue = parseFloat("11"); 

console.log(floatValue.isFloat()); // will output true 
console.log(nonFloatValue.isFloat()); // will output false 

値が本当にJSのfloatと考えることができないことができ、あるいは、むしろすべてのであるかどうかを確認するにはnumberはJSのfloatです。


EDIT:組み込み型のプロトタイプを拡張することは悪いことであると考えられます(正当な理由があるため)。運用環境ではその使用はお勧めしません。あなたはまだこのチェックを普通の関数として実装することができます

+0

これは大きな浮動小数点では機能しません。 (Number.MAX_VALUE * Math.random())%1!= 0 // falseを返します。これは、モジュールが大きな浮動小数点で0を返すためです。 –

+1

@ Mient-janStellingそれは浮きの技術的な制限です。彼らは精密な問題を抱えていて、おおまかに言えば、技術的には特定のしきい値を上回る数値はありません。 POC: 'Math.round(Number.MAX_VALUE - 0.001)=== Number.MAX_VALUE - 0.001'(実際には、上記の丸め方の方程式を上記の丸め方の方程式で置き換えることができます) – Powerslave

7

以下の関数もフォーマットをチェックします。例えば。 JavaScriptのネイティブparseIntparseFloat関数は、数値以外の文字を含む文字列も解析するため、上記の関数はこれに影響を受けます。

// For example, following code will work 
var n = parseInt('123asd'); 
n == 123 

これらの関数は、このような文字列に対してfalseを返します。

function isFloat(val) { 
    var floatRegex = /^-?\d+(?:[.,]\d*?)?$/; 
    if (!floatRegex.test(val)) 
     return false; 

    val = parseFloat(val); 
    if (isNaN(val)) 
     return false; 
    return true; 
} 

function isInt(val) { 
    var intRegex = /^-?\d+$/; 
    if (!intRegex.test(val)) 
     return false; 

    var intVal = parseInt(val, 10); 
    return parseFloat(val) == intVal && !isNaN(intVal); 
} 
+0

Nikolaは"、 "有効ですフロートセパレータ?私はドットがあると思う。 –

+1

@DragomirIvanov、私たちはユーザーの入力を議論しています。数値形式はユーザーのロケールによって異なります。例えば。ドイツでは小数点の区切り記号としてコンマを使用し、千単位の区切り記号としてピリオドを使用します。あなたは言語の構文については正しいです。プログラミング言語は主に小数点の区切り文字にピリオドを使用しますが、これは当初の問題ではありませんでした。これは、ロケールの厳密な実装がないため、1つの場所で両方の形式をサポートするため、上記の正規表現の問題です。私はこれが記事全体を必要とするので、これがこの問題の範囲を超えていると思う。 –

+0

この 'floatRegex'は' 1231.'または '87.'に対して真を返します。私は次の方が良いと思います: '/^- ?\ d +([。、]?\ d +)?$ /'。これは、整数もBTWにも真を返します。 – haffla

2

文字列がfloatである場合は、値がintやfloat型であるかどうかを確認する必要がある場合は(int型の値を避けるため)

function isFloat(n) { 
    if(n.match(/^-?\d*(\.\d+)?$/) && !isNaN(parseFloat(n)) && (n%1!=0)) 
     return true; 
    return false; 
} 

var nonfloat = isFloat('12'); //will return false 
var nonfloat = isFloat('12.34abc'); //will return false 
var float = isFloat('12.34'); //will return true 
1

を確認するには:

function isFloatOrInt(n) { 
    return !isNaN(n) && n.toString().match(/^-?\d*(\.\d+)?$/); 
} 
2

私はその機能を書きました文字列、整数、浮動小数点を受け取る

function isInt(x) { 
    return !isNaN(x) && eval(x).toString().length == parseInt(eval(x)).toString().length 
} 

function isFloat(x) { 
    return !isNaN(x) && !isInt(eval(x)) && x.toString().length > 0 
} 

例ouptuts:まっすぐ進む

console.log(isFloat('0.2')) // true 
console.log(isFloat(0.2)) // true 
console.log(isFloat('.2')) // true 
console.log(isFloat('-.2')) // true 
console.log(isFloat(-'.2')) // true 
console.log(isFloat(-.2)) // true 
console.log(isFloat('u.2')) // false 
console.log(isFloat('2')) // false 
console.log(isFloat('0.2u')) // false 

console.log(isInt('187')) // true 
console.log(isInt(187)) // true 
console.log(isInt('1.2')) // false 
console.log(isInt('-2')) // true 
console.log(isInt(-'1')) // true 
console.log(isInt('10e1')) // true 
console.log(isInt(10e1)) // true 
1

:私の場合は

if (parseFloat(value).toString() === value.toString()) { 
    ... 
} 
+1

が巧妙であるが、同じ番号の複数の有効な表現が存在する場合には失敗する。 'parseFloat( '0.0000000000000001')。toString()' 1e-16'を返します。 – Michael

+0

あなたは毎日何か新しいことを学びます:) ...素敵なコーナーケース... – user2846569

+0

また、parseFloat( '1234567.890')。toString()== 1234567.89 – igo

1

非常に単純な正規表現は、トリックを行いました。

入力が有効な金額であるかどうかを検証する必要がありました。私は単純に使用しました -

/^[0-9]+(\.)?[0-9]*$/.test(number) 

//のすべてが正規表現です。

/^は、単語の先頭から一致が始まることを意味し、$/は一致が単語で終わることを意味します。単語が文字0で始まるとは思わない場合、式は[1-9][0-9]*

[0-9]+のようになります。単語は少なくとも1つの数字で始まる必要があります。

注:*+は、1つまたは複数と?一つまたはなしを意味することを意味する、ゼロまたはそれ以上を意味します。

ここまでの式は/^[1-9][0-9]*$/で、これは整数だけを検証します。

数字のピリオド(。)をテストするには、式に\.を使用する必要があります。 .はすべて一致する特殊文字で、\.は期間にのみ一致します。

最後に、別の文字クラス[0-9]*は、0桁以上の数字と一致します。

テストケース

/^[0-9]+(\.)?[0-9]$/.test("21.38a") // ==> false 
/^[0-9]+(\.)?[0-9]$/.test("21.38") // ==> true 
/^[0-9]+(\.)?[0-9]$/.test("y2781.68") // ==> false 
/^[0-9]+(\.)?[0-9]$/.test("2781r.68") // ==> false 
+0

科学記法はどうですか? 2e3は2000です。負の数値はどうですか? – doug65536

0

intまたはが

function getNumericVal(str) { 
    if(isNaN(str)) return; 
    try {return parseFloat(str);} 
    catch(e) {return parseInt(str);} 
} 
1
function checkFloat(value) { 
    let parsed = Number.parseFloat(value); 
    return (!Number.isNaN(parsed)) && (!Number.isInteger(parsed)) 
} 
1

使用この浮いた場合、この関数は関係なく、文字列の数値を返します。

var isNumber = /^\d+\.\d+$/.test(value); 
0

Uをこのjqueryコードを

<script> 
    $(document).ready(function() { 
     $(".allow_only_float").keypress(function (e) { 

      if (e.which != 46 && e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) { 
       e.preventDefault();//return false; 
      } 
      var avg = $('#<%=txtAverage.ClientID%>').val(); 
      var idx = avg.indexOf("."); 
      if (idx > -1 && e.which == 46) { 
       e.preventDefault();//return false; 
      } 
     }); 
    }); 
    </script> 
<body> 
    <input type='text' class='allow_only_float'> 
</body> 
関連する問題