Ввод чисел HTML5 - всегда показывать 2 десятичных знака


103

Есть ли способ отформатировать input[type='number'] значение, чтобы всегда отображать 2 десятичных знака?

Пример: я хочу видеть 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 Mendicant Bias

Большой! Вы можете добавить этот код в changeметод, чтобы он
запускался

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-разрядная
версия

13

Использование stepатрибута включит его . Он определяет не только продолжительность цикла, но и допустимые числа. Использование step="0.01" должно помочь, но это может зависеть от того, насколько браузер соответствует стандарту.

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


7
у меня не работает. Если я нажимаю до 5,01, а затем вниз, в Chrome 72
отображается

Если вы ищете строго числовую интерпретацию, это правильное поведение, «5.00» - это строка.
Dissident Rage

1
не имеет значения. Вопрос состоит в том, чтобы всегда отображать 2 десятичных знака, а в этом ответе этого не происходит.
gman

Затем они ищут input[type="text"]все встроенные навороты, которые идут с input[type="number"]полностью переработанными для него функциями, или заменяют это поле другим, чтобы отображать значение в зависимости от состояния элемента.
Dissident Rage

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атрибут input numberили text. Если он возвращается, textдаже если HTML написан как, numberтогда браузер не поддерживает этот тип, и привязка этого поведения к нему является подходящим действием.
Dissident Rage

Если бы вы указали это в комментарии, я бы изменил свой ответ, включив эту функцию. Большинство приложений в наши дни либо вообще не работают без 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" />


Это работает только тогда, когда элемент теряет фокус. если пользователь сразу же нажмет кнопку отправки после заполнения поля ввода, он не увидит исправленное значение, которое может вводить в заблуждение.
Total Newbie

Я не уверен на 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

Если вы приземлились здесь, просто задаетесь вопросом, как ограничить до 2 знаков после запятой, у меня есть собственное решение 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
Это лучший и более современный подход, чем многие другие ответы, но он по-прежнему не помещает конечные нули в то, что вводится
pcnate
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.