<İnput type = “number”> içinde 2 ondalık basamağa izin ver


222

Ben bir <input type="number">ve ben tamamen giriş veya 2 ondalık basamaklara kadar ondalık sayılar ile kullanıcıların girişini kısıtlamak istiyorum.

Temel olarak, bir fiyat girişi istiyorum.

Normal ifade yapmaktan kaçınmak istedim. Bunu yapmanın bir yolu var mı?

<input type="number" required name="price" min="0" value="0" step="any">

2
type = "number" geniş tarayıcı desteğine sahip değil. İstediğiniz girişi aldığınızdan emin olmak için bazı javascript içeren bir metin kutusu kullanmak daha iyidir.
www139

6
Evet, ama girdiler type="text"zaten geri düşüyor , ne önemi var ki?
Ultimater


/^\d+\.\d{2,2 {$/ benim için 0.00
ZStoneDPM

Yanıtlar:


336

Bunun yerine, step="any"herhangi bir sayıda ondalık basamağa step=".01"izin veren, iki ondalık basamağa kadar izin veren kullanın .

Spesifikasyonda daha fazla ayrıntı: https://www.w3.org/TR/html/sec-forms.html#the-step-attribute


38
Bu doğru cevap değil. adımı yalnızca tıklattığınızda veya bastığınızda ne olacağını belirler ve hiçbir şey kısıtlamaz.
Ini

1
@Michael_B spec ne umuyor olursa olsun, bu test etmek oldukça önemsiz: jsfiddle.net/9hvm0b5u hala 2'den fazla ondalık sayı girilmesine izin veriyor. Adımlar yalnızca +/- düğmelerinin miktarı ne kadar hareket ettirdiğini belirler. (Chrome)
Nathan

3
@Michael_B kullanıcının herhangi bir girdide olduğu gibi bir sayı yazması engellenmez 500.12345, belki de gereksinimleri anlamamız farklıdır.
Nathan

3
Kullanıcının ondalık iminin herhangi bir sayıda rakam yazabilirsiniz iken, çoğu tarayıcı geçersiz değere ve CSS seçicileri ile formun gönderilmesini izin vermez, unutulmamalıdır :validve :invalidbeklendiği gibi uygulanır.
Andrew Dinmore

1
@Nathan, tarayıcı doğrulamasını test etmek de önemlidir. 2'den fazla ondalık basamağa sahip bir değer göndermeyi deneyin: jsfiddle.net/4yesgn7b
imclean

43

Eğer biri yalnızca isteğe bağlı 2 ondalık basamağı olan sayılara izin veren bir normal ifade arıyorsa

^\d*(\.\d{0,2})?$

Bir örnek olarak, aşağıdaki çözümün oldukça güvenilir olduğunu gördüm

HTML:

<input name="my_field" pattern="^\d*(\.\d{0,2})?$" />

JS / JQuery:

$(document).on('keydown', 'input[pattern]', function(e){
  var input = $(this);
  var oldVal = input.val();
  var regex = new RegExp(input.attr('pattern'), 'g');

  setTimeout(function(){
    var newVal = input.val();
    if(!regex.test(newVal)){
      input.val(oldVal); 
    }
  }, 0);
});

2
SetTimeout () öğesine sahip olmanın amacı nedir?
Derek

2
@Derek. Ben öyle düşünüyorum ki regex.test DOM engellemiyor. Bunu
arayın

2
@Derek sadece ayarlanmadan önce olayın tamamlanmasını setTimeout()beklemek olduğunu varsayabilirim (aksi takdirde ile aynı olacaktır ). Ancak, 0 zaman aşımı ile anlamsızdır ve her iki değer de genellikle aynı olduğundan (Firefox'ta) çalışmaz. Örneğin 1 olarak ayarlarsanız iyi çalışır. keydownnewValoldVal
alstr

Böylece, düzenlememi "onaylanmamış düzenleme yanıtın biçimlendirme kalitesini düşürüyor" nedeniyle iki farklı gönderiye geri döndürdünüz. Düzenlememin nasıl onaylanmadığını ve yanıtlayıcının kalitesini tam olarak nasıl düşürdüğünü açıklayabilir misiniz? (IMO, geliştirir, çünkü insanlar kodu doğrudan postadan çalıştırabilir ve JSFiddle'a gitmeleri gerekmez).
çift ​​bip

21

Para birimi için şunu öneririm:

<div><label>Amount $
    <input type="number" placeholder="0.00" required name="price" min="0" value="0" step="0.01" title="Currency" pattern="^\d+(?:\.\d{1,2})?$" onblur="
this.parentNode.parentNode.style.backgroundColor=/^\d+(?:\.\d{1,2})?$/.test(this.value)?'inherit':'red'
"></label></div>

Bkz. Http://jsfiddle.net/vx3axsk5/1/

HTML5 özellikleri "adım", "dk" ve "kalıp" form gönderildiğinde değil, onurda değil doğrulanır. Eğer ihtiyacınız stepvarsa bir patternve ihtiyacınız patternyoksa bir step. step="any"Desen yine de doğrulayacağından kodumla geri dönebilirsiniz .

Onblur'u doğrulamak istiyorsanız, kullanıcıya görsel bir ipucu vermenin arka planı kırmızı renklendirmek gibi yararlı olduğuna inanıyorum. Kullanıcının tarayıcısı desteklemiyorsa type="number"geri dönecektir type="text". Kullanıcının tarayıcısı HTML5 kalıp doğrulamasını desteklemiyorsa, JavaScript snippet'im formun gönderilmesini engellemez, ancak görsel bir ipucu verir. Bu nedenle, HTML5 desteği zayıf olan kişiler ve JavaScript devre dışı bırakılmış veya HTTP İstekleri dövme ile veritabanına girmeye çalışan kişiler için, yine de sunucuda tekrar doğrulamanız gerekir. Ön uçta doğrulamanın önemli olduğu nokta, daha iyi bir kullanıcı deneyimi sağlamaktır. Bu nedenle, kullanıcılarınızın çoğu iyi bir deneyime sahip olduğu sürece, kodun yine de çalışması ve arka uçta doğrulayabilmeniz koşuluyla HTML5 özelliklerine güvenmek iyidir.


2
MDN'ye göre , patternçalışmaz input type=number:<input type="number"> elements do not support use of the pattern attribute for making entered values conform to a specific regex pattern. The rationale for this is that number inputs can't contain anything except numbers, and you can constrain the minimum and maximum number of valid digits using the min and max attributes, as explained above.
izogfif

@izogfif İyi not. Ayrıca, her ikisine de ihtiyacınız olmadığını ve üç yol sağladığınızı not ettim: Adım, desen ve onblur. O zamanki gerekçem, bir tarayıcının bir nedenden ötürü diğerine sahip olmasıydı. Ön uç doğrulaması için bugünlerde adımlara güvenmek olasıdır.
Ultimater

16

1. Adım: HTML numarası giriş kutunuzu bir değişim etkinliğine bağlayın

myHTMLNumberInput.onchange = setTwoNumberDecimal;

veya HTML kodunda

<input type="number" onchange="setTwoNumberDecimal" min="0" max="10" step="0.25" value="0.00" />

2. Adım: setTwoDecimalPlaceYöntemi yazın

function setTwoNumberDecimal(event) {
    this.value = parseFloat(this.value).toFixed(2);
}

toFixed()Yönteme iletilen değeri değiştirerek ondalık basamak sayısını değiştirebilirsiniz . Bkz. MDN belgeleri .

toFixed(2); // 2 decimal places
toFixed(4); // 4 decimal places
toFixed(0); // integer

3
parseFloat (parseFloat (this.value) (.toFixed 2)); Ondalık veya sayı türü istiyorsanız, varsayılan olarak toFixed () yöntemi dizeyi döndürdüğü gibi parseFloat () öğesine her şeyi sarabilirsiniz.
spacedev

6

Ben jQuery kullanarak benim en iyi çözüm bulundu.

$( "#my_number_field" ).blur(function() {
    this.value = parseFloat(this.value).toFixed(2);
});

6

Giriş türünde yalnızca 2 ondalığa izin vermek için bunu deneyin

<input type="number" step="0.01" class="form-control"  />

Veya @SamohtVII tarafından önerilen şekilde jQuery kullanın

$( "#ELEMENTID" ).blur(function() {
    this.value = parseFloat(this.value).toFixed(2);
});

21
Bu, Chrome 57'deki ondalık sayıları 2 yerle sınırlamaz
mintedsky

1
Bu doğru değil. adımı yalnızca tıklattığınızda veya bastığınızda ne olacağını belirler ve hiçbir şey kısıtlamaz.
Ini

adımı ayrıca 1.000 gibi bir sayının girilmesini de önler.
Zapnologica

-2

Bu kodu kullan

<input type="number" step="0.01" name="amount" placeholder="0.00">

Varsayılan olarak HTML5 Giriş öğeleri için Adım değeri adım = "1" dir.


-4

sadece yaz

<input type="number" step="0.1" lang="nb">

lang = 'nb "ondalık sayılarınızı virgül veya nokta ile yazmanıza izin verir


"lang = 'nb' ondalık sayılarınızı virgül veya nokta ile yazmanıza izin verir" Başka bir şey için konuşamıyorum, ancak bu benim için Chrome'da çalışmıyor.
Andrew Dinmore

-9

Girişte:

step="any"
class="two-decimals"

Komut dosyasında:

$(".two-decimals").change(function(){
  this.value = parseFloat(this.value).toFixed(2);
});

5
Lütfen yayında slurs kullanmaktan kaçının. Ve iyi olmayı
James
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.