입력 유형 = "숫자"가 음수 값을 얻지 못하게하는 방법이 있습니까?


답변:


658

다음 과 같은 min속성을 사용하십시오 .

<input type="number" min="0">


222
화살표 버튼 / 스피너를 사용하여 음수가 입력되는 것을 차단합니다. 그러나 사용자는 여전히 수동으로 음수를 입력하고 해당 필드 값을 음수로 읽도록하여 min 속성을 무시할 수 있습니다.
ecbrodie

52
@demaniak No. 그리고이 답변이 절반으로 답할 때 어떻게 많은
찬사를 받았습니까?

1
@Abraham 양식에 -ve 값이로드 된 데이터가 빨간색으로 표시되지 않으면 어떻게됩니까?
Kamini

2
작동하지 않습니다. 사용자는 여전히 수동으로 음수를 입력 할 수 있습니다.
Altef four

129

@Abhrabm 답변에 만족하지 못했습니다 .

위 / 아래 화살표로 음수 가 입력되는 것을 막는 반면 사용자는 키보드로 음수를 입력 할 수 있습니다.

해결책은 키 코드 로 방지하는 것입니다 .

// Select your input element.
var number = document.getElementById('number');

// Listen for input event on numInput.
number.onkeydown = function(e) {
    if(!((e.keyCode > 95 && e.keyCode < 106)
      || (e.keyCode > 47 && e.keyCode < 58) 
      || e.keyCode == 8)) {
        return false;
    }
}
<form action="" method="post">
  <input type="number" id="number" min="0" />
  <input type="submit" value="Click me!"/>
</form>

@Hugh Guiney가 제공 한 설명 :

점검중인 키 코드 :

  • 95에서 <106은 Numpad 0 내지 9에 해당하고;
  • 47에서, <58은 숫자 행에서 0 내지 9에 대응하고; 8은 백 스페이스입니다.

따라서이 스크립트는 유효하지 않은 키가 입력되는 것을 방지합니다.


20
상향 조정되었지만 어떤 키 코드를 점검하고 있는지 명확히하는 것이 도움이 될 것이라고 생각합니다.> 95, <106은 Numpad 0 ~ 9에 해당합니다. > 47, <58은 숫자 행의 0에서 9에 해당합니다. 8은 백 스페이스입니다. 따라서이 스크립트는 키 이외의 키를 입력하지 못하게합니다. 철저하지만 알파벳 숫자 키를 이미 필터링하는 숫자 입력을 기본적으로 지원하는 브라우저에는 무리가있을 수 있습니다 (숫자 의미를 가질 수있는 "e"와 같은 문자 제외). 189 (대시) 및 109 (빼기)에 대비하면 충분할 것입니다. 그런 다음와 결합하십시오 min="0".
휴 기니

1
@Manwal 키보드를 사용하여 숫자를 복사하여 붙여 넣을 수 없습니다. 마우스를 사용하여 음수를 붙여 넣을 수 있습니다.
Beniton

1
@Beniton이 사용 사례를 제공해 주셔서 감사합니다. 당신이하고있는 일에 대해 조금이라도 알려주시겠습니까? 항상 도와 드릴 수 있습니다. 실행 가능한 코드 나 바이올린을 제공하십시오. 코드에서 양식 제출 레벨 유효성 검사를 수행 할 수 있습니다. 음수를 허용하지 않으면 항상 백엔드 에서 확인해야하지만 .
Manwal

1
기본적으로 필드에 복사하여 붙여 넣기 만하면됩니다. 실제로 특별한 경우가 아닙니다. 키 코드를 통해 유효성 검사를 처리하는 대신 onChange 또는 focusOut을 수행하고 음수를 포착하는 작은 유효성 검사 기능을 작성하는 것이 좋습니다.
ulisesrmzroche

1
화살표 키 (37, 38, 39, 41)에 대한 조건도 입력해야합니다. || (e.keyCode>36 && e.keyCode<41)이를 통해 사용자는 위 / 아래 화살표를 통해 숫자를 늘리거나 줄일 수 없으며 숫자를 편집하기 위해 오른쪽 / 왼쪽으로 이동할 수 없습니다.
vusan

86

나를 위해 해결책은 다음과 같습니다.

<input type="number" min="0" oninput="this.value = Math.abs(this.value)">

1
범위 내에 있지 않으면 모델이 업데이트되지 않기 때문에 패턴을 사용하고 angular로 noformvalidate 한 번만 사용하는 것이 가장 좋습니다. 내 경우 :<input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="..." noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) ">
sebius

이것은 사용자가 기본값이 0임을 알고있을 때 가장 잘 작동합니다. 다른 현명한 사용자는 왜 백 스페이스를 누르면 혼란스러워합니까? 이 점을 제외하고는 최상의 솔루션입니다. +1
Deep 3015

1
당신은 내 하루를 저장
stackmalux

이것은 가장 잘 작동하며 십진수도 사용합니다. 위의 다른 대답을 사용했지만 십진수가 허용되면 작동이 중지되었습니다. 사람들이 이것을 주로 사용할 수 있도록이 답변을 위로 이동할 수있는 방법이 있습니까?
Subhan Ahmed

31

이 코드는 나를 위해 잘 작동합니다. 다음을 확인하십시오.

<input type="number" name="test" min="0" oninput="validity.valid||(value='');">

2
이것은 작동하지만 입력을 시도한 후 전체 입력을 비우는 -것은 실제로 좋은 생각이 아닙니다.
extempl

9
@extempl 부정적인 의미가 없음을 나타내는 상식에 사용자가 부정적인 것을 입력하려고하는 사용자에게 공정한 형벌처럼 들린다.
KhoPhi

3
<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">-이 모든 숫자가 아닌 문자를 제거합니다
올레 Melnyk에게

@Rexford 동의합니다. 그러나 부정적인 내용 min="0"이 없도록 설정했습니다 . 음수 값을 원하면이 속성을 제거하십시오.
Chinmay235

1
나는 이것을 시도했지만 소수점이있는 숫자가 입력되는 것을 막았다.
klent

21

쉬운 방법 :

<input min='0' type="number" onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57">


좋고 쉬운 ...하지만 여전히 음수를 붙여 넣을 수 있습니다.
Ralf

10

음수가 입력 된 경우 십진수를 허용하고 전체 입력을 지우고 싶지 않았습니다. 이것은 적어도 크롬에서 잘 작동합니다.

<input type="number" min="0" onkeypress="return event.charCode != 45">

여기에 더 많은 ASCII 번호를 추가하는 방법. 예를 들어. 45와 함께 46을 더하고 싶습니다. 어떻게 할 수 있습니까?
Pradeep Singh

3
@PradeepSingh "return [45, 46] .indexOf (event.charCode) == -1"
Kay는 Reinstate Monica

상자 밖으로 생각하십시오. a keypress가 입력에 음수를 입력 할 수있는 유일한 방법 인지 정말로 확신
하십니까

6

@Manwal 대답은 ​​좋지만 더 나은 가독성을 위해 코드 줄이 적은 코드를 좋아합니다. 또한 대신 HTML에서 onclick / onkeypress 사용법을 사용하고 싶습니다.

내 제안 솔루션도 동일합니다 : 추가

min="0" onkeypress="return isNumberKey(event)"

html 입력에

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : event.keyCode;
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

자바 스크립트 함수로.

말했다시피, 똑같습니다. 문제를 해결하는 방법을 개인적으로 선호합니다.


5

jQuery를 사용하면 다음 코드를 사용하여 포커스 아웃에서 음수 값을 덮어 쓸 수 있습니다.

$(document).ready(function(){
    $("body").delegate('#myInputNumber', 'focusout', function(){
        if($(this).val() < 0){
            $(this).val('0');
        }
    });
});

이것은 서버 측 유효성 검사를 대체하지 않습니다!


이 벌금을 작동하는 경우 가 바로 언론 분야에서 여전히 동안 입력하지만 경우에 사용자가 입력 필드 밖으로 초점을 맞추고; 여전히 음수를 입력 할 수 있습니다.
NemyaNation

3

각도 2 솔루션은 다음과 같습니다.

OnlyNumber 클래스를 작성하십시오

import {Directive, ElementRef, HostListener} from '@angular/core';

@Directive({
  selector: '[OnlyNumber]'
})
export class OnlyNumber {

  // Allow decimal numbers. The \. is only allowed once to occur
  private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);

  // Allow key codes for special events. Reflect :
  // Backspace, tab, end, home
  private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home'];

  constructor(private el: ElementRef) {
  }

  @HostListener('keydown', ['$event'])
  onKeyDown(event: KeyboardEvent) {
    // Allow Backspace, tab, end, and home keys
    if (this.specialKeys.indexOf(event.key) !== -1) {
      return;
    }

    // Do not use event.keycode this is deprecated.
    // See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
    let current: string = this.el.nativeElement.value;
    // We need this because the current value on the DOM element
    // is not yet updated with the value from this event
    let next: string = current.concat(event.key);
    if (next && !String(next).match(this.regex)) {
      event.preventDefault();
    }
  }
}

app.module.ts의 선언에 OnlyNumber를 추가하고 앱 어디에서나 이와 같이 사용하십시오.

<input OnlyNumber="true">

붙여 넣기를 허용하는 방법이 있습니까? 또한 정규식을 다음과 같이 변경했습니다 ./^-?[0-9]+(\.[0-9]*){0,1}$/g 음수를 허용하지만 작동하지 않는 것 같습니까?
Dave Nottage

2
oninput="this.value=(this.value   < Number(this.min) || this.value   > Number(this.max))  ? '' : this.value;"

2
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
Sudheesh Singanamalla

이것이 정답 일 수 있지만 충분한 세부 정보가 부족합니다. 이것이 왜 작동 하는지 설명하십시오 . 스택 오버플로를 사용할 때 이것이 살아있는 지식 기반 이라고 생각하십시오. 지식을 공유하지 않는 답변은 그다지 유용하지 않습니다.
Marc LaFleur

2

더 많은 코드로 HTML을 더럽 히지 않으려면 다른 방법으로 Angular를 사용하여 추가하십시오.

필드 valueChanges구독하고 Value를 절대 값으로 설정해야합니다 (다른 valueChange가 발생하므로 재귀 호출 및 최대 호출 크기 초과 오류를 유발하므로 새 이벤트를 생성하지 않도록주의해야 함).

HTML 코드

<form [formGroup]="myForm">
    <input type="number" formControlName="myInput"/>
</form>

TypeScript 코드 (구성 요소 내부)

formGroup: FormGroup;

ngOnInit() { 
    this.myInput.valueChanges 
    .subscribe(() => {
        this.myInput.setValue(Math.abs(this.myInput.value), {emitEvent: false});
    });
}

get myInput(): AbstractControl {
    return this.myForm.controls['myInput'];
}

1

<input type="number" name="credit_days" pattern="[^\-]+" 
    #credit_days="ngModel" class="form-control" 
    placeholder="{{ 'Enter credit days' | translate }}" min="0" 
    [(ngModel)]="provider.credit_days"
    onkeypress="return (event.charCode == 8 || event.charCode == 0 || 
    event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 
    57" onpaste="return false">


1

이에 대한 답변은 도움이되지 않습니다. 위 / 아래 키를 사용할 때만 작동하지만 -11을 입력하면 작동하지 않습니다. 여기에 내가 사용하는 작은 수정이 있습니다.

이것은 정수입니다

  $(".integer").live("keypress keyup", function (event) {
    //    console.log('int = '+$(this).val());
    $(this).val($(this).val().replace(/[^\d].+/, ""));
    if (event.which != 8 && (event.which < 48 || event.which > 57))
    {
        event.preventDefault();
    }
   });

가격이 많을 때

        $(".numeric, .price").live("keypress keyup", function (event) {
     //    console.log('numeric = '+$(this).val());
    $(this).val($(this).val().replace(/[^0-9\,\.]/g, ''));

    if (event.which != 8 && (event.which != 44 || $(this).val().indexOf(',') != -1) && (event.which < 48 || event.which > 57)) {
        event.preventDefault();
    }
   });

0

이 솔루션을 사용하면 키보드로 복사 붙여 넣기를 포함한 모든 키보드 기능을 사용할 수 있습니다. 마우스로 음수를 붙여 넣을 수 없습니다. 모든 브라우저에서 작동하며 코드 펜 의 데모 는 부트 스트랩과 jQuery를 사용합니다. 영어 이외의 언어 설정 및 키보드에서 작동합니다. 브라우저가 붙여 넣기 이벤트 캡처 (IE)를 지원하지 않으면 포커스 아웃 후 음수 부호가 제거됩니다. 이 솔루션은 기본 브라우저가 min = 0 type = number 인 것처럼 동작합니다.

마크 업 :

<form>
  <input class="form-control positive-numeric-only" id="id-blah1" min="0" name="nm1" type="number" value="0" />
  <input class="form-control positive-numeric-only" id="id-blah2" min="0" name="nm2" type="number" value="0" />
</form>

자바 스크립트

$(document).ready(function() {
  $("input.positive-numeric-only").on("keydown", function(e) {
    var char = e.originalEvent.key.replace(/[^0-9^.^,]/, "");
    if (char.length == 0 && !(e.originalEvent.ctrlKey || e.originalEvent.metaKey)) {
      e.preventDefault();
    }
  });

  $("input.positive-numeric-only").bind("paste", function(e) {
    var numbers = e.originalEvent.clipboardData
      .getData("text")
      .replace(/[^0-9^.^,]/g, "");
    e.preventDefault();
    var the_val = parseFloat(numbers);
    if (the_val > 0) {
      $(this).val(the_val.toFixed(2));
    }
  });

  $("input.positive-numeric-only").focusout(function(e) {
    if (!isNaN(this.value) && this.value.length != 0) {
      this.value = Math.abs(parseFloat(this.value)).toFixed(2);
    } else {
      this.value = 0;
    }
  });
});

0

다음은 숫자 만 허용하는 QTY 필드에 가장 적합한 솔루션입니다.

// Only allow numbers, backspace and left/right direction on QTY input
    if(!((e.keyCode > 95 && e.keyCode < 106) // numpad numbers
        || (e.keyCode > 47 && e.keyCode < 58) // numbers
        || [8, 9, 35, 36, 37, 39].indexOf(e.keyCode) >= 0 // backspace, tab, home, end, left arrow, right arrow
        || (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + A
        || (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + C
        || (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + X
        || (e.keyCode == 86 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + V
    )) {
        return false;
    }

0

If Number is Negative or Positive Using ES6s Math.Sign

const num = -8;
// Old Way
num === 0 ? num : (num > 0 ? 1 : -1); // -1

// ES6 Way
Math.sign(num); // -1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.