Girdi türü = “sayı” nın negatif değerler almasını önlemenin bir yolu var mı?


302

Ben sadece olumlu değerler almak istiyorum, sadece html kullanarak önlemek için herhangi bir yolu var mı
Lütfen doğrulama yöntemi önermeyin

Giriş kontrolünün ekran görüntüsü


3
Bu konu aynı soruyu çok daha iyi
yanıtlıyor

Yanıtlar:


658

Bu minözelliği aşağıdaki gibi kullanın :

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


222
Bu, ok düğmeleri / döndürücü kullanılarak negatif bir sayının girilmesini engeller. Bununla birlikte, kullanıcı yine de manuel olarak negatif bir sayı girebilir ve bu alanın değerinin negatif bir sayı olarak okunmasını sağlayabilir, böylece min niteliğini atlayabilir.
ecbrodie

52
Peki bu soruya yarı cevap verdiğinde bu cevap nasıl bu kadar çok oy aldı?
GôTô

1
@Abraham Ya formdaki -ve değeri ile yüklenen veriler kırmızı olarak işaretlemezse.
Kamini

2
Bu işe yaramaz, kullanıcı yine de manuel olarak negatif bir sayı girebilir.
Altef dört

129

@Abhrabm yanıtından memnun kalmadım çünkü:

Yalnızca negatif sayıların yukarı / aşağı oklardan girilmesini engellerken , kullanıcı klavyeden negatif sayı yazabilir.

Çözüm, anahtar koduyla önlemektir :

// 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 tarafından sağlanan açıklama :

Hangi anahtar kodları kontrol ediliyor:

  • 95, <106 Numpad 0 ila 9'a karşılık gelir;
  • 47, <58 Sayı Satırında 0'dan 9'a karşılık gelir; ve 8 Backspace'dir.

Dolayısıyla bu komut dosyası girişte geçersiz anahtar girilmesini engelliyor.


20
Oy verildi, ancak hangi anahtar kodlarının kontrol edildiğini netleştirmeye yardımcı olacağını düşünüyorum:> 95, <106 Numpad 0 ila 9; > 47, <58 Sayı Satırında 0'dan 9'a karşılık gelir; ve 8 Backspace'dir. Bu komut dosyası, anahtarlar dışında herhangi bir anahtarın girilmesini engelliyor. Kapsamlı ama alfabetik anahtarları (sayısal bir anlamı olan "e" gibi karakterler hariç) filtreleyen sayı girişlerini yerel olarak destekleyen tarayıcılar için aşırıya kaçmış olabileceğini düşünüyorum. Muhtemelen 189 (çizgi) ve 109'a (çıkarma) karşı önlem almak yeterli olacaktır. Ve sonra ile birleştirin min="0".
Hugh Guiney

1
@Manwal Klavyeyi kullanarak sayıları kopyalayıp yapıştırmayı kısıtlar. Ve fareyi kullanarak negatif sayıları kopyalamama izin veriyor.
Beniton

1
@Beniton Bu kullanım durumunu verdiğiniz için teşekkür ederiz. Bana ne yaptığına dair biraz fikir verebilir misin, her zaman sana yardım edebilirim. Lütfen küçük çalıştırılabilir kod veya keman sağlayın. Kodunuz için Form gönderme düzeyi doğrulaması yapabilirsiniz. Her ne kadar negatif sayılara izin vermiyorsam Backend'de her zaman kontrol etmeme rağmen .
Manwal

1
Temel olarak alana kopyalayıp yapıştırmanız yeterlidir. Gerçekten özel bir durum falan değil. Doğrulamayı anahtar koduyla işlemek yerine, üzerinde değişiklik yapmak veya odakOut yapmak ve herhangi bir negatif sayıyı yakalamak için küçük bir doğrulama işlevi oluşturmak muhtemelen daha iyidir.
ulisesrmzroche

1
Ok tuşu (37, 38, 39, 41) için koşul da konulmalıdır. || (e.keyCode>36 && e.keyCode<41)Bu, kullanıcının yukarı / aşağı ok yoluyla sayıyı artırmasına / azaltmasına ve numarayı düzenlemek için sağa / sola gitmesine izin vermez.
Vusan 5:39

86

Benim için çözüm şuydu:

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

1
Desen aralığını kullandığınızda ve açısal ile noformvalidate yaptığınızda gerçekten en iyi çözüm, model aralıkta değilse güncellenmez. Benim durumum:<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

bu en iyi, kullanıcı varsayılan değer 0 olduğunu bildiğinde işe yarar. Diğer bilge kullanıcılar, alanın neden temizlenmediği konusunda geri tuşuna basarlar. Bunun dışında en iyi çözüm. + 1
Deep 3015

1
günümü kurtardın
stackmalux

Bu en iyi çalışır ve ondalık kullanılması durumunda da. Yukarıda başka bir cevap kullandım, ondalık sayıya izin verildiğinde çalışmayı durdurdu. Bu cevabı yukarı taşıyabilmemizin bir yolu var mı?
Subhan Ahmed

31

Bu kod benim için iyi çalışıyor. Lütfen kontrol edebilir misin:

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

2
Bu işe yarıyor, ancak yazmaya çalıştıktan sonra tüm girdiyi boşaltmak -gerçekten iyi bir fikir değil.
extempl

9
@extempl Sağduyunun olumsuz olmadığını gösteren bir alana negatif girmeye çalışan kullanıcıya adil bir ceza gibi geliyor.
KhoPhi

3
<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">- bu, tüm sayısal olmayan simgeleri kaldıracak
Oleh Melnyk

@Rexford Katılıyorum, Ama ayarladım min="0"bu yüzden hiç nagative yok. Negatif değer vermek istiyorsanız, bu özelliği kaldırın.
Mayıs 18:16

1
Bunu denedim ama ondalık noktalı sayıların girilmesini engelledi.
1919'da

21

Kolay yöntem:

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


Güzel ve kolay ... ama yine de negatif sayılar yapıştırılabilir.
Ralf

10

Bir negatif girilirse ondalık sayılara izin vermek ve tüm girdiyi silmek istemedim. Bu en azından kromda iyi çalışır:

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

Nasıl daha fazla ascii numarası buraya ekleyebilirsiniz. örneğin. 45 i ile de 46 ekleyin. Nasıl yapılabilir?
Pradeep Singh

3
@PradeepSingh "return [45, 46] .indexOf (event.charCode) == -1"
ykay, Reinstate Monica'yı

Lütfen kutunun dışında düşünün. keypressBirinin bir girişe negatif bir sayı girebilmesinin tek yolu olduğundan emin misiniz ...
Roko C. Buljan

6

@Manwal cevap iyidir, ama daha iyi okunabilirlik için daha az kod satırı ile kodu seviyorum. Ayrıca html yerine onclick / onkeypress kullanımını kullanmayı seviyorum.

Önerdiğim çözüm de aynısını yapıyor: Ekle

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

html girişine ve

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

bir javascript işlevi olarak.

Söylendiği gibi, aynı şeyi yapıyor. Sorunun nasıl çözüleceği sadece kişisel tercih.


5

Sadece referans için: jQuery ile, aşağıdaki kodla odak üzerinde negatif değerlerin üzerine yazabilirsiniz:

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

Bu, sunucu tarafı doğrulamasının yerini almaz!


Bu cezayı çalışır EĞER hemen basın alanında hala iken girmek ancak eğer kullanıcı giriş alanına dışına odaklanır; yine de negatif bir sayı girebilirler.
NemyaNation

3

İşte açısal 2 çözümü:

bir sınıf oluşturun 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 içindeki bildirimlere OnlyNumber ekleyin ve uygulamanızın herhangi bir yerinde böyle kullanın

<input OnlyNumber="true">

Bunun için Yapıştır'a izin vermenin bir yolu var mı? Ayrıca normal ifadeyi şu şekilde değiştirdim: /^-?[0-9 Karışık+(\.[0-9 Cialis*){0,1 <br$/g Negatif sayılara izin vermek için, ancak işe yaramıyor mu?
Dave Nottage

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

2
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Sudheesh Singanamalla

Bu doğru cevap olsa da, yeterince ayrıntı içermiyor. Lütfen bunun neden işe yaradığını açıklayın . Stack Overflow kullanırken, bunun yaşayan bir bilgi tabanı olduğunu ve bilgiyi paylaşmayan cevapların çok daha az yararlı olduğunu düşünün .
Marc LaFleur

2

Bunu yapmanın başka bir yolunu eklemek (Açısal kullanarak)HTML'yi daha fazla kodla kirlemek istemiyorsanız :

Yalnızca valueChanges alan alanına abone olmanız ve Değeri mutlak bir değer olarak ayarlamanız gerekir (başka bir değere neden olacağından yeni bir etkinlik yaymamaya dikkat ederek)

HTML KODU

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

TypeScript CODE (Bileşeninizin İçinde)

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

Bunun cevabı faydalı değil. çünkü sadece yukarı / aşağı tuşlarını kullandığınızda çalışır, ancak -11 yazarsanız çalışmaz. İşte benim kullandığım küçük bir düzeltme

tamsayılar için bu

  $(".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();
    }
   });

fiyatlarınız olduğunda bunu yapın

        $(".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

Bu çözüm, klavyeyle kopyala yapıştır dahil tüm klavye işlevlerine izin verir. Negatif sayıların fare ile yapıştırılmasını önler. Kod tarayıcıdaki tüm tarayıcılar ve demo ile çalışır bootstrap ve jQuery kullanır. Bu, İngilizce dışındaki dil ayarları ve klavyelerle çalışmalıdır. Tarayıcı, yapıştır olayı yakalamayı (IE) desteklemiyorsa, odaklandıktan sonra negatif işareti kaldırır. Bu çözüm, yerel tarayıcının min = 0 tip = sayı ile olması gerektiği gibi davranır.

İşaretleme:

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

JavaScript

$(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

İşte sadece sayılara izin veren bir QTY alanı için en iyi şekilde çalışan bir çözüm.

// 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.