<입력 유형 =“숫자”>에 소수점 이하 2 자리 허용


222

나는 a를 가지고 있으며 <input type="number">사용자 입력을 순수하게 소수 또는 소수점 이하 2 자리까지의 숫자로 제한하고 싶습니다.

기본적으로 가격 입력을 요청합니다.

정규식을 피하고 싶었습니다. 그것을 할 수있는 방법이 있습니까?

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

2
type = "number"는 광범위한 브라우저를 지원하지 않습니다. 자바 스크립트가있는 텍스트 상자를 사용하여 원하는 입력을 얻는 것이 좋습니다.
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
이것은 정답이 아닙니다. step은 클릭하거나 눌렀을 때 발생하는 일만 제어하며 아무것도 제한하지 않습니다.
Ini

1
@Michael_B는 스펙이 기대하는 바에 관계없이 테스트하기가 쉽지 않습니다 . 단계는 +/- 버튼으로 금액을 이동하는 내용 만 제어합니다. (크롬)
Nathan

3
@Michael_B 사용자는 입력과 같이 숫자를 입력하는 것을 막을 수 없으며 500.12345요구 사항에 대한 이해가 다를 수 있습니다.
Nathan

3
사용자가 소수 놓은 후 자리의 숫자를 입력 할 수있는 반면, 대부분의 브라우저가 잘못된 값과 CSS 선택기와 양식의 제출을 허용하지 않습니다, 그 주목해야 :valid하고 :invalid예상대로 적용됩니다.
Andrew Dinmore

1
@Nathan은 브라우저 유효성 검사를 테스트하는 것도 쉽지 않습니다. 소수점 이하 두 자리 이상의 값을 제출해보십시오. jsfiddle.net/4yesgn7b
불완전

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 ()의 목적은 무엇입니까?
Derek

2
@ 데릭. 나는 그것이 regex.test가 DOM을 차단하지 않는다고 가정합니다. 이것을 찾아보십시오 : developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
christo8989

2
@Derek 나는 이벤트가 완료 setTimeout()되기를 기다리는 것만 가정 할 수 있다고 가정 할 수있다 (그렇지 않으면와 동일하다 ). 그러나 시간 초과가 0이면 의미가 없으며 Firefox에서 두 값이 모두 동일하기 때문에 작동하지 않습니다. 예를 들어 1로 설정하면 제대로 작동합니다. keydownnewValoldVal
alstr

따라서 "승인되지 않은 수정은 답변의 형식 품질을 저하시킵니다"라는 이유로 두 개의 다른 게시물에서 내 수정 사항을 롤백했습니다. 내 수정 사항이 승인되지 않은 방식과 답변의 품질이 정확히 어떻게 저하되는지 설명해 주시겠습니까? (IMO는 사람들이 게시물에서 직접 코드를 실행할 수 있고 JSFiddle에 갈 필요가 없기 때문에 개선합니다.)
2

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 속성 "step", "min"및 "pattern"은 양식을 제출할 때 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 참고 사항. 또한 실제로 두 가지가 모두 필요하지 않으며 Step, pattern 및 onblur의 세 가지 방법을 제공했습니다. 당시 나의 근거는 브라우저가 어떤 이유로 브라우저에 다른 이유가 있는지 여부였습니다. 프론트 엔드 유효성 검사를 위해 요즘 단계에 의존하는 것이 안전합니다.
Ultimater

16

1 단계 : HTML 번호 입력 상자를 onchange 이벤트에 연결

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)); 십진수 또는 숫자 유형을 원하면 기본적으로 parFiFed () 메소드가 문자열을 리턴하므로 parseFloat ()에 모든 것을 랩핑 할 수 있습니다.
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"  />

또는 @SamohtVII가 제안한 jQuery를 사용하십시오.

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

21
Chrome 57에서는 소수를 2 자리로 제한하지 않습니다.
mintedsky

1
이것은 정확하지 않습니다. step은 클릭하거나 눌렀을 때 발생하는 일만 제어하며 아무것도 제한하지 않습니다.
Ini

단계는 또한 1.000과 같은 숫자가 입력되는 것을 방지합니다.
Zapnologica

-2

이 코드를 사용하십시오

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

기본적으로 HTML5 입력 요소의 단계 값은 step = "1"입니다.


-4

그냥 써

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

lang = 'nb "쉼표 또는 마침표로 10 진수를 쓸 수 있습니다


"lang = 'nb'쉼표 나 마침표로 10 진수를 쓸 수 있습니다."다른 언어로는 말할 수 없지만 Chrome에서는 작동하지 않습니다.
Andrew Dinmore

-9

입력시 :

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

스크립트에서 :

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

5
게시물에 비방을 사용하지 마십시오. 그리고 멋져요
제임스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.