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 Mendicant 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.00'이 아니라 '1200'입니다.
릭 글로스

8
이 모든 작업은 단계 화살표가 수행하는 작업을 제어하는 ​​것 같습니다. 값을 1/3로 설정해도 결과가 소수점 2 자리로 제한되지 않습니다
Sonic Soul

Chrome 버전 78.0.3904.108 (공식 빌드) (64 비트)에서는 작동하지 않습니다
Fasco

13

은 Using step속성은 그것을 가능하게 할 것이다 . 순환해야하는 양뿐만 아니라 허용되는 숫자도 결정합니다. 사용 하는 것이 트릭을 수행 step="0.01" 해야 하지만 이것은 브라우저가 표준을 어떻게 준수하는지에 따라 달라질 수 있습니다.

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


7
나를 위해 작동하지 않습니다. 5.01까지 클릭 한 다음 아래로 클릭하면 Chrome 72에서 5.00이 아니라 5라고 표시됩니다
gman

엄격하게 숫자로 해석하려는 경우 올바른 동작이고 "5.00"은 문자열입니다.
반체제 분노

1
관련이 없습니다. 질문은 항상 소수점 이하 2 자리를 표시하려고 하며이 답변은 그렇게하지 않습니다.
gman

그런 다음 철저하게 구현 된 input[type="text"]모든 기본 종소리와 휘파람을 input[type="number"]찾거나 요소 상태에 따라 값을 표시하기 위해이 필드를 다른 필드로 교체합니다.
반체제 분노

8

사용하는 솔루션 input="number" step="0.01"은 Chrome에서 잘 작동하지만 일부 브라우저, 특히 필자의 경우 Frontmotion Firefox 35에서는 작동하지 않습니다. 지원해야합니다.

내 솔루션은 다음과 같이 Igor Escobar의 jQuery Mask 플러그인을 사용하는 jQuery였습니다.

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

이 경우 자바 스크립트는 기본 동작이 아닌 폴백이어야합니다. 기능이 존재하지 않으면 Javascript를 연결하는 것이 적절합니다. 입력의 type속성이 number또는 인지 테스트하여이를 확인할 수 있습니다 text. textHTML이 작성되었지만 반환되는 경우 number브라우저는 해당 유형을 지원하지 않으며이 동작을 여기에 연결하는 것이 적절한 조치입니다.
반체제 분노

귀하가 의견에 해당 기능을 포함하도록 내 답변을 수정했다고 표시했다면. 요즘 대부분의 응용 프로그램은 js .. 없이는 전혀 작동하지 않거나 거의 작동하지 않습니다. 그러나 나는 수표를 넣는 것이 대답을 향상시킬 것이라는 데 동의합니다. 현재 여행 중입니다. 돌아 오면 수정하겠습니다.
little_birdie 2016-08-05

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 자리제한 하는 방법이 궁금하다면 네이티브 자바 스크립트 솔루션이 있습니다.

자바 스크립트 :

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를 사용해야합니다.

나는 이것이 항상 후행 0을 강제하기 때문에 이것이 큰 숫자에 이상적이지 않다는 점을 지적해야합니다. 따라서 사용자는 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

이것은 .toFixed(2)소수점 두 자리에 대한 함수를 사용하는 JQuery의 빠른 포맷터입니다 .

<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
스테핑에는 괜찮지 만 서식을 지정하지 않습니다. 소수점 이하 두 자리를 원하고 누군가 "0.1"을 입력 (또는 회전)하면 모든 브라우저에서 "0.1"(원하는 "0.01"대신)으로 유지됩니다. 자리 표시자는 빈 조건에서만 작동합니다 (형식도 아님)
MC9000

-3

이것이 정답입니다.

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


4
이것은 다른 많은 답변보다 더 좋고 현대적인 접근 방식이지만 여전히 입력 된 내용에 후행 0을 넣지 않습니다
pcnate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.