Введення числа HTML5 - Завжди показуйте 2 знаки після коми


103

Чи є якийсь спосіб відформатувати input[type='number']значення, щоб завжди відображатися два знаки після коми?

Приклад: Я хочу бачити 0.00замість 0.

Відповіді:


62

Вирішено відповідно до пропозицій та додавання фрагмента jQuery для примусового форматування на цілі числа:

parseFloat($(this).val()).toFixed(2)

step = '0.01' не працює для Chrome 66.0 parseFloat працює як шарм. robot_speed = parseFloat(robot_speed).toFixed(2)
05032 жебручих Bias

Чудово! Ви можете додати цей код в changeметод , щоб викликати його кожен раз , коли змінюється поле: stackoverflow.com/a/58502237/2056125
mhellmeier

60

Насправді ти не можеш, але ти можеш бути на півдорозі:

<input type='number' step='0.01' value='0.00' placeholder='0.00' />


16
Це не працює в Chrome 55.0.2883.75. Якщо я створю елемент форми, розміщую розмітку зверху всередині, вводите "1200" у вкладку та клацніть подалі від елемента, відображається текст все ще "1200", а не "1200.00".
Рік Глос

8
все це, здається, робить, це контролювати те, що роблять крокові стрілки. встановлення значення 1/3 не обмежить результат двома десятковими знаками
Sonic Soul

Не працює для версії Chrome 78.0.3904.108 (Офіційна збірка) (64-розрядна)
Fasco

13

Використання stepатрибуту дозволить його . Він визначає не тільки кількість циклу, але й допустимі цифри. Використання step="0.01" має робити хитрість, але це може залежати від того, як браузер дотримується стандарту.

<input type='number' step='0.01' value='5.00'>


7
не працює для мене. Якщо я натискаю до 5,01, а потім вниз, він говорить 5, а не 5,00 в Chrome 72
gman

Якщо ви шукаєте суворо числове тлумачення, це правильна поведінка, "5,00" - це рядок.
Дисидентська лють

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

Потім вони шукають input[type="text"]усі нативні дзвіночки, які поставляються з input[type="number"]ретельною компенсацією для цього, або замінюють це поле на інше, щоб відобразити значення залежно від стану елемента.
Дисидентська лють

8

Рішення, які використовують input="number" step="0.01"для мене, чудово працюють у Chrome, однак вони не працюють у деяких браузерах, зокрема у Frontmotion Firefox 35 у моєму випадку .., які я повинен підтримувати.

Моїм рішенням було jQuery за допомогою плагіна jQuery Mask Ігоря Ескобара таким чином:

<script src="/your/path/to/jquery-mask.js"></script>
<script>
    $(document).ready(function () {
        $('.usd_input').mask('00000.00', { reverse: true });
    });
</script>

<input type="text" autocomplete="off" class="usd_input" name="dollar_amt">

Це добре працює, звичайно, слід перевірити подане значення згодом :) ПРИМІТКА, якщо мені не довелося це робити для сумісності браузера, я б використав вищевказану відповідь від @Rich Bradshaw.


2
Не впевнений, чому це було знято .. на мій подив. Як я вже говорив у своїй відповіді, це альтернативне рішення лише для тих, хто (як я) застряг у підтримці браузерів, у яких інша відповідь не працює. І я знаю, що це працює, тому що зараз він працює і працює!
little_birdie

Javascript в цьому випадку повинен бути резервним, а не поведінкою за замовчуванням. Якщо функціональності не існує, підключення Javascript до неї підходить. Ви можете перевірити це, перевіривши, чи є typeатрибут вводу numberабо text. Якщо він повертається, textнавіть незважаючи на те, що HTML написаний так, як numberбраузер не підтримує цей тип, і підключення цієї поведінки до нього є відповідною дією.
Дисидентська гнів

Якби ви вказали, що в коментарі я б змінив свою відповідь, щоб включити цю функціональність. Більшість програм сьогодні не працюють взагалі без js .. або ледве працюють .. тому це стає суперечливим. Але я погоджуюся, що введення перевірки покращило б відповідь. Наразі я подорожую .. Зміню його, коли повернусь.
little_birdie

5

На основі цієї відповіді від @Guilherme Ferreira ви можете запускати parseFloatметод щоразу, коли поле змінюється. Тому значення завжди показує два знаки після коми, навіть якщо користувач змінює значення, ввівши число вручну.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $(".floatNumberField").change(function() {
            $(this).val(parseFloat($(this).val()).toFixed(2));
        });
    });
</script>

<input type="number" class="floatNumberField" value="0.00" placeholder="0.00" step="0.01" />


Це працює лише тоді, коли елемент втрачає фокус. якщо користувач негайно натисне кнопку "Надіслати" після заповнення поля введення, він не побачить виправлене значення, яке може ввести в оману.
Всього новачок

Я не впевнений на 100%, але думаю, що ця change()функція буде запущена за малий час між входом користувача та натисканням кнопки подання. Тому це не повинно бути проблемою.
mhellmeier

Так, це дійсно змінюється, але користувач не знатиме, що може призвести до плутанини, оскільки користувач не побачить виправлене значення до того, як воно буде негайно подано. Хоча це може не бути проблемою для більшості випадків використання
Total Newbie

3

Це працює для застосування максимум 2 знаків після коми без автоматичного округлення до 2 місць, якщо користувач не закінчив вводити текст.

function naturalRound(e) {

   let dec = e.target.value.indexOf(".")
   let tooLong = e.target.value.length > dec + 3
   let invalidNum = isNaN(parseFloat(e.target.value))

   if ((dec >= 0 && tooLong) || invalidNum) {
     e.target.value = e.target.value.slice(0, -1)
   }
}

3

Якщо ви приземлилися тут просто цікаво, як обмежити два знаки після коми, у мене є власне рішення JavaScript:

Javascript:

function limitDecimalPlaces(e, count) {
  if (e.target.value.indexOf('.') == -1) { return; }
  if ((e.target.value.length - e.target.value.indexOf('.')) > count) {
    e.target.value = parseFloat(e.target.value).toFixed(count);
  }
}

HTML:

<input type="number" oninput="limitDecimalPlaces(event, 2)" />

Зауважте, що це не може AFAIK, захищати від цього хромованого помилки за допомогою введення номера.


1

Я знаю, що це давнє запитання, але мені здається, що жодна з цих відповідей не відповідає на запитання, яке задають так, сподіваємось, це допоможе комусь у майбутньому.

Так, ви завжди можете показувати 2 знаки після коми, але, на жаль, це неможливо зробити лише з атрибутами елементів, ви повинні використовувати JavaScript.

Слід зазначити, що це не ідеально підходить для великих чисел, оскільки це завжди змусить тримати нулі, тому користувачеві доведеться повернути курсор назад замість видалення символів, щоб встановити значення, що перевищує 9,99

//Use keyup to capture user input & mouse up to catch when user is changing the value with the arrows
    $('.trailing-decimal-input').on('keyup mouseup', function (e) {

        // on keyup check for backspace & delete, to allow user to clear the input as required
        var key = e.keyCode || e.charCode;
        if (key == 8 || key == 46) {
            return false;
        };

        // get the current input value
        let correctValue = $(this).val().toString();

         //if there is no decimal places add trailing zeros
        if (correctValue.indexOf('.') === -1) {
            correctValue += '.00';
        }

        else {

            //if there is only one number after the decimal add a trailing zero
            if (correctValue.toString().split(".")[1].length === 1) {
                correctValue += '0'
            }

            //if there is more than 2 decimal places round backdown to 2
            if (correctValue.toString().split(".")[1].length > 2) {
                correctValue = parseFloat($(this).val()).toFixed(2).toString();
            }
        }

        //update the value of the input with our conditions
        $(this).val(correctValue);
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="my-number-input" class="form-control trailing-decimal-input" type="number" min="0.01" step="0.01" value="0.00" />


1

Це швидкий формат у JQuery з використанням .toFixed(2)функції для двох знаків після коми.

<input class="my_class_selector" type='number' value='33'/>


// if this first call is in $(document).ready() it will run
// after the page is loaded and format any of these inputs

$(".my_class_selector").each(format_2_dec);
function format_2_dec() {
    var curr_val = parseFloat($(this).val());
    $(this).val(curr_val.toFixed(2));
}

Мінуси: вам потрібно викликати це кожного разу, коли номер введення змінюється для його переформатування.

// listener for input being changed
$(".my_class_selector").change(function() {
    // potential code wanted after a change

    // now reformat it to two decimal places
    $(".my_class_selector").each(format_2_dec);
});

Примітка: чомусь навіть якщо вхід має тип "число", jQuery val()повертає рядок. Звідси parseFloat().


0

Мій переважний підхід, який використовує dataатрибути для утримання стану числа:

<input type='number' step='0.01'/>

// react to stepping in UI
el.addEventListener('onchange', ev => ev.target.dataset.val = ev.target.value * 100)

// react to keys
el.addEventListener('onkeyup', ev => {

    // user cleared field
    if (!ev.target.value) ev.target.dataset.val = ''

    // non num input
    if (isNaN(ev.key)) {

        // deleting
        if (ev.keyCode == 8)

            ev.target.dataset.val = ev.target.dataset.val.slice(0, -1)

    // num input
    } else ev.target.dataset.val += ev.key

    ev.target.value = parseFloat(ev.target.dataset.val) / 100

})

0

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

var delayTimer;
function input(ele) {
    clearTimeout(delayTimer);
    delayTimer = setTimeout(function() {
       ele.value = parseFloat(ele.value).toFixed(2).toString();
    }, 800); 
}
<input type='number' oninput='input(this)'>

https://jsfiddle.net/908rLhek/1/


-1
import { Component, Pipe, PipeTransform } from '@angular/core';

@Pipe({
    name: 'replace'
})

export class ReplacePipe implements PipeTransform {
    transform(value: any): any {
        value = String(value).toString();
        var afterPoint = '';
        var plus = ',00';
        if (value.length >= 4) {
            if (value.indexOf('.') > 0) {
                afterPoint = value.substring(value.indexOf('.'), value.length);
                var te = afterPoint.substring(0, 3);
                if (te.length == 2) {
                    te = te + '0';
                }
            }
            if (value.indexOf('.') > 0) {
                if (value.indexOf('-') == 0) {
                    value = parseInt(value);
                    if (value == 0) {
                        value = '-' + value + te;
                        value = value.toString();
                    }
                    else {
                        value = value + te;
                        value = value.toString();
                    }
                }
                else {
                    value = parseInt(value);
                    value = value + te;
                    value = value.toString();
                }
            }
            else {
                value = value.toString() + plus;
            }
            var lastTwo = value.substring(value.length - 2);
            var otherNumbers = value.substring(0, value.length - 3);
            if (otherNumbers != '')
                lastTwo = ',' + lastTwo;
            let newValue = otherNumbers.replace(/\B(?=(\d{3})+(?!\d))/g, ".") + lastTwo;
            parseFloat(newValue);
            return `${newValue}`;
        }
}
}

Ви можете спробувати цю трубу
RamakanthReddy Kowdampalli


-3

Погляньте на це :

 <input type="number" step="0.01" />

5
Це нормально для крокових дій, але не для їх форматування. Якщо вам потрібно 2 десяткових знаки і хтось введе (або обертається) "0,1", він залишиться "0,1" (замість того, що бажано "0,01") у всіх браузерах. Заставник працює лише для порожнього стану (це теж не формат)
MC9000

-3

Це правильна відповідь:

<input type="number" step="0.01" min="-9999999999.99" max="9999999999.99"/>


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