Consenti 2 cifre decimali in <input type = “number”>


222

Ho un <input type="number">e voglio limitare l'input degli utenti a numeri puramente o numeri con decimali fino a 2 cifre decimali.

Fondamentalmente, sto chiedendo un input di prezzo.

Volevo evitare di fare regex. C'è un modo per farlo?

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

2
type = "number" non ha un ampio supporto per il browser. È meglio usare solo una casella di testo con alcuni javascript per assicurarsi di ottenere l'input desiderato.
www139,

6
Sì, ma gli input ricadono type="text"comunque, quindi che importa?
Ultimater,


/^\d+\.\d{2,2}$/ ha funzionato per me per richiedere 0.00
ZStoneDPM

Risposte:


337

Invece di step="any", che consente un numero qualsiasi di cifre decimali, utilizzare step=".01", che consente fino a due posizioni decimali.

Maggiori dettagli nelle specifiche: https://www.w3.org/TR/html/sec-forms.html#the-step-attribute


38
Questa non è la risposta corretta il passaggio regola solo ciò che accade quando si fa clic o si preme verso l'alto e non limita nulla.
Ini

1
@Michael_B indipendentemente da ciò che le specifiche sperano, questo è abbastanza banale da testare: jsfiddle.net/9hvm0b5u consente comunque di inserire più di 2 decimali. I passaggi regolano solo ciò per cui i pulsanti +/- spostano l'importo. (Chrome)
Nathan,

3
@Michael_B non viene impedito all'utente di digitare un numero come 500.12345in nessuno degli input, forse la nostra comprensione dei requisiti è diversa.
Nathan,

3
Va notato che, mentre l'utente può digitare un numero qualsiasi di cifre dopo la cifra decimale, la maggior parte dei browser non consentirà l'invio del modulo con un valore non valido e i selettori CSS :valide :invalidverranno applicati come previsto.
Andrew Dinmore,

1
@Nathan, è anche banale testare la validazione del browser. Prova a inviare un valore con più di 2 cifre decimali: jsfiddle.net/4yesgn7b
imclean

43

In questo caso qualcuno è alla ricerca di una regex che consenta solo numeri con un 2 decimali opzionali

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

Per un esempio, ho trovato la soluzione di seguito abbastanza affidabile

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
Qual è lo scopo di avere setTimeout ()?
Derek,

2
@Derek. Suppongo sia così che regex.test non blocchi il DOM. Cerca questo: developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
christo8989

2
@Derek Posso solo supporre che setTimeout()sia attendere il keydowncompletamento dell'evento prima di impostare newVal(altrimenti sarà lo stesso del oldVal). Tuttavia, con un timeout di 0, è inutile e non funziona poiché entrambi i valori sono spesso uguali (in Firefox). Se lo si imposta su 1, ad esempio, funziona bene.
alstr,

Quindi, hai eseguito il rollback della mia modifica in due post diversi con un motivo "la modifica non approvata degrada la qualità di formattazione della risposta". Potete per favore spiegare in che modo la mia modifica non è approvata e in che modo degrada la qualità della risposta? (IMO, lo migliora, poiché le persone potrebbero eseguire il codice direttamente dal post e non hanno bisogno di andare su JSFiddle).
doppio segnale acustico

21

Per la valuta, suggerirei:

<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>

Vedi http://jsfiddle.net/vx3axsk5/1/

Le proprietà HTML5 "step", "min" e "pattern" verranno convalidate quando il modulo viene inviato, non onblur. Non hai bisogno di stepse hai un patterne non hai bisogno di patternse hai un step. Quindi potresti tornare al step="any"mio codice poiché il modello lo convaliderà comunque.

Se desideri validare onblur, credo che dare all'utente un segnale visivo sia anche utile come colorare lo sfondo rosso. Se il browser dell'utente non supporta type="number", verrà eseguito il fallback a type="text". Se il browser dell'utente non supporta la convalida del pattern HTML5, il mio frammento JavaScript non impedisce l'invio del modulo, ma fornisce un segnale visivo. Quindi per le persone con scarso supporto HTML5 e le persone che cercano di hackerare il database con JavaScript disabilitato o forgiare richieste HTTP, è comunque necessario convalidare nuovamente sul server. Il punto con la convalida sul front-end è un'esperienza utente migliore. Quindi, fintanto che la maggior parte dei tuoi utenti ha una buona esperienza, va bene fare affidamento sulle funzionalità HTML5 purché il codice continui a funzionare e tu possa validare sul back-end.


2
Secondo MDN , patternnon funziona per 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 Buona nota. Nota anche che in realtà ho notato che non hai bisogno di entrambi e ho fornito tre modi: Step, pattern e onblur. La mia logica all'epoca era se un browser si soffocava su uno per qualche motivo e ha l'altro. Probabilmente è sicuro fare affidamento sul passaggio in questi giorni per la convalida del frontend.
Ultimater,

16

Passaggio 1: agganciare la casella di input del numero HTML a un evento onchange

myHTMLNumberInput.onchange = setTwoNumberDecimal;

o nel codice HTML

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

Passaggio 2: scrivere il setTwoDecimalPlace metodo

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

È possibile modificare il numero di cifre decimali variando il valore passato nel toFixed()metodo. Vedi i documenti MDN .

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

3
parseFloat (parseFloat (this.value) .toFixed (2)); Se si desidera il tipo decimale o numerico, è possibile racchiudere il tutto in parseFloat () poiché il metodo toFixed () predefinito restituisce stringa.
spacedev

6

Ho scoperto che usare jQuery era la mia migliore soluzione.

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

6

Prova questo per consentire solo 2 decimali nel tipo di input

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

Oppure usa jQuery come suggerito da @SamohtVII

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

21
Ciò non limita i decimali a 2 posizioni in Chrome 57
mintedsky

1
Questo non è corretto il passaggio regola solo ciò che accade quando si fa clic o si preme verso l'alto e non limita nulla.
Ini

step impedisce anche di inserire numeri come 1.000.
Zapnologica,

-2

Usa questo codice

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

Per impostazione predefinita, il valore Step per gli elementi di input HTML5 è step = "1".


-4

Scrivi e basta

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

lang = 'nb "ti consente di scrivere i tuoi numeri decimali con virgola o punto


"lang = 'nb' ti consente di scrivere i tuoi numeri decimali con virgola o punto" Non posso parlare per nient'altro, ma non funziona in Chrome per me.
Andrew Dinmore,

-9

Su input:

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

Sulla sceneggiatura:

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

5
Si prega di evitare l'uso di insulti nel tuo post. E ricorda di essere gentile
James,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.