2017-11-13 1 views
0

フォームに数値入力フィールドがあります。そして私は、私はそれがあまりにも大きい持っており、それを許可していません検出し99999999999999999の値を提出しようとした場合99999999999999最大入力で小数点以下2桁までの数字入力の検証は機能しません

する2と最大値に小数点以下の桁数の最大値を設定しました。 99.123を提出しようとすると、小数点以下の桁数が多すぎるため、許可されません。

しかし、99999999999996.123を提出しようとすると、小数点以下の桁数が多すぎることは検出されません。

どうすればこの問題を解決できますか?

var app = angular.module('Appp', []); 
 

 
app.controller('metadataCtrl', function ($scope, $http) { 
 
    $scope.vm = { myItems : {} } 
 

 
    $scope.item = {type: "a", value: 99999999999998}; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<form ng-app="Appp" name="myForm" ng-controller="metadataCtrl"> 
 

 
    <input type="number" 
 
     step="0.01" 
 
     max="99999999999999" 
 
     min="0" 
 
     step-message="{name} can only have a maximum of 2 decimal places" 
 
     ng-model="item.value"/> 
 

 
    <input type="submit" value="Submit"> 
 

 
</form>

+2

ジャスト 'はconsole.log(99999999999996.123を)'実行し、あなたはその理由を理解します。数字はちょうど64ビットです。実数の無限を64ビットで保存することはできません。最大の数字は、最も正確でない数字になります。 –

答えて

0

それはあなたの入力99999999999996.123はまだ99999999999999より低い、小数点以下の桁についてではありません。 maxは小数点以下の桁数には関係ありませんが、小数点以下の桁数を確認したい場合は、自分でディレクティブのバリデーターを作成する必要があります。さらに、step属性は、小数点以下の桁数を制限するのではなく、指定したレートで増分する値を使用する必要があることのみを指定します。つまり、ステップの倍数で値のみを受け入れます。

のRef .: MDN web docs -<input>

はおそらく、あなたは、小数点以下2桁を検証ng-pattern="/^[0-9]+(\.[0-9]{1,2})?$/"を使用することができます。しかし、javascriptの数は64ビットで定義されているので、このような大きな数を使用すると問題が発生します。数字が大きくなると精度が落ちます。入力値を自己の数値として扱うのは難しいです。例えば:9999999999999999は、10000000000000000と評価されます。

次の例では、ng-patternを使用して小数点以下の桁数を検証していますが、javascript Numberピットの落下を防ぐことはできません。

var app = angular.module('Appp', []); 
 

 
app.controller('metadataCtrl', function($scope, $http) { 
 
    $scope.vm = { 
 
    myItems: {} 
 
    } 
 

 
    $scope.item = { 
 
    type: "a", 
 
    value: 9999999999999.99 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<form ng-app="Appp" name="myForm" ng-controller="metadataCtrl"> 
 

 
    <input type="number" 
 
     step="0.01" 
 
     max="99999999999999" 
 
     min="0" 
 
     name="myField" 
 
      ng-pattern="/^[0-9]+(\.[0-9]{1,2})?$/" 
 
     ng-model="item.value"/> 
 

 
    <input type="submit" value="Submit"> 
 
    <br> 
 
    {{ myForm.myField.$error }} 
 
    <br> 
 
    <span ng-if="myForm.myField.$error.pattern">myField can only have a maximum of 2 decimal places</span> 
 
</form>

+0

これは検証に影響します。次のデモで0.12と入力してください。http://plnkr.co/edit/Xih8PR6D5uU0W2xgWxNU?p=preview –

+0

しかし、質問には答えません。 –

+0

この種の問題を検出する方法はありますか?今のところ私はサポートされている最大の数字を少なくしました。 – RagnaRock

関連する問題