Дозволити 2 знаки після коми у <введення типу = "число">


222

У мене є <input type="number">і я хочу обмежити введення користувачів чисто числоми чи числами з десятковими знаками до 2 знаків після коми.

В основному, я прошу ввести ціну.

Я хотів уникати регексу. Чи є спосіб це зробити?

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

2
type = "number" не має широкої підтримки браузера. Краще просто скористатися текстовим полем з деяким javascript, щоб переконатися, що ви отримаєте потрібний вклад.
www139

6
Так, але вхід type="text"все одно повертається , і що це має значення?
Ultimater


/^\d+\.\d{2,2}$/ працював для мене, щоб вимагати 0,00
ZStoneDPM

Відповіді:


336

Замість цього step="any", що дозволяє отримати будь-яку кількість десяткових знаків, використовуйте step=".01", що дозволяє до двох знаків після коми.

Детальніше у специфікації: https://www.w3.org/TR/html/sec-forms.html#the-step-attribute


38
Це не правильна відповідь. крок керує лише тим, що відбувається при натисканні або натисканні вгору, і це нічого не обмежує.
Іні

1
@Michael_B незалежно від того, на що спец сподівається, це досить тривіально для перевірки: jsfiddle.net/9hvm0b5u все ще дозволяє ввести більше 2 десяткових знаків. Ці кроки регулюють лише те, на що кнопки +/- переміщують суму. (Chrome)
Натан

3
@Michael_B користувачеві не заважає вводити таке число, як 500.12345у будь-якому з входів, можливо, наше розуміння вимог інше.
Натан

3
Слід зазначити, що, хоча користувач може вводити будь-яку кількість цифр після десяткових знаків, більшість браузерів не дозволять подавати форму з недійсним значенням та селекторами CSS :validі :invalidзастосовуються як очікується.
Ендрю Дінмор

1
@Nathan, також тривіально перевірити перевірку браузера. Спробуйте подати значення з більш ніж двома знаками
imclean

43

Якщо ви хочете, хтось шукає регулярний вираз, який дозволяє лише цифри з необов'язковими 2 знаками після коми

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

Наприклад, я знайшов рішення нижче досить надійним

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 ()?
Дерек

2
@Derek. Я припускаю, що так regex.test не блокує DOM.
Знайдіть

2
@Derek Я можу лише припустити, що setTimeout()потрібно почекати завершення keydownподії перед встановленням newVal(інакше це буде те саме, що і oldVal). Однак із затримкою 0, це безглуздо і не працює, оскільки обидва значення часто однакові (у Firefox). Наприклад, якщо ви встановите його на 1, він справно працює.
alstr

Отже, ви відмовились від моєї редакції у двох різних публікаціях із причиною, що "незатверджене редагування погіршує якість форматування відповіді". Чи можете ви пояснити, як не змінюється редагування та як саме воно погіршує якість відповіді? (IMO, це покращує його, оскільки люди можуть запускати код прямо з поста і їм не потрібно переходити до JSFiddle).
подвійний звуковий сигнал

21

Для валюти я б запропонував:

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

Дивіться http://jsfiddle.net/vx3axsk5/1/

Властивості HTML5 "крок", "хв" та "шаблон" будуть перевірені під час подання форми, а не onblur. Вам не потрібно, stepякщо у вас є, patternі вам не потрібно, patternякщо у вас є step. Таким чином, ви можете повернутися до step="any"мого коду, оскільки шаблон буде його перевірити в будь-якому випадку.

Якщо ви хочете перевірити onblur, я вважаю, що надати користувачеві візуальну підказку також корисно, як фарбування фону в червоний колір. Якщо веб-переглядач користувача не підтримує type="number"його, він стане резервним type="text". Якщо браузер користувача не підтримує перевірку шаблону HTML5, мій фрагмент JavaScript не заважає форму надсилати форму, але він надає візуальну підказку. Тож людям з поганою підтримкою HTML5 та людям, які намагаються зламати базу даних із відключеним JavaScript або підробляти HTTP-запити, вам потрібно знову перевірити їх на сервері. Точка з валідацією на передній частині - для кращого користувальницького досвіду. Тож, поки більшість ваших користувачів мають хороший досвід, непогано покладатися на функції HTML5 за умови, що код все ще буде працювати і ви зможете перевірити його на задній частині.


2
За інформацією MDN , patternце не працює для 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 Хороша примітка. Також зауважте, що я фактично зазначив, що вам не потрібно і те, і запропонував три способи: крок, візерунок та onblur. Моє обґрунтування в той час було, якщо браузер захлинувся одним, чомусь він має інший. Напевно, безпечно розраховувати на крок у наші дні для перевірки фронту.
Ultimater

16

Крок 1: Підключіть поле введення HTML-номера до події, що змінюється

myHTMLNumberInput.onchange = setTwoNumberDecimal;

або в коді HTML

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

Крок 2: Напишіть setTwoDecimalPlaceметод

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

Ви можете змінити кількість десяткових знаків після зміни значення, переданого toFixed()методу. Див. Документи MDN .

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

3
parseFloat (parseFloat (this.value) .toFixed (2)); Якщо ви хочете ввести десятковий чи числовий номер, ви можете обернути всю річ у parseFloat (), як за замовчуванням метод toFixed () повертає рядок.
spacedev

6

Я виявив, що використання jQuery було найкращим рішенням.

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

6

Спробуйте це для дозволу лише 2 десяткових знаків для типу введення

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

Або використовуйте jQuery, як запропонував @SamohtVII

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

21
Це не обмежує десяткових знаків двома місцями в Chrome 57
1717 року

1
Це неправильно. крок керує лише тим, що відбувається при натисканні або натисканні вгору, і це нічого не обмежує.
Іні

крок також запобігає введенню числа типу 1.000.
Zapnologica

-2

Використовуйте цей код

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

За замовчуванням значення Step для елементів введення HTML5 - це step = "1".


-4

просто напишіть

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

lang = 'nb "дозволяє записувати десяткові числа з комою або крапкою


"lang = 'nb" дозволяє записувати свої десяткові цифри комою або крапкою "Не можу говорити ні про що інше, але це не працює для Chrome.
Ендрю Дінмор

-9

На вході:

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

За сценарієм:

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

5
Будь ласка, уникайте використання службових служб у своїх публікаціях. І пам’ятайте, що це добре
Джеймс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.