Cara membuat ketik = "angka" hanya untuk angka positif

285

Saat ini saya memiliki kode berikut

<input type="number" />

itu keluar untuk sesuatu seperti ini

masukkan deskripsi gambar di sini

Hal-hal pemilih kecil di sebelah kanan memungkinkan angka untuk menjadi negatif. Bagaimana saya mencegahnya?

Saya ragu menggunakan type="number", ini menyebabkan lebih banyak masalah daripada menyelesaikannya, saya akan memeriksa kewarasannya, jadi haruskah saya kembali menggunakan type="text"?

Arian Faurtosh
sumber
4
Anda masih harus memvalidasi nilai di server. Siapa pun dapat mengganti bidang untuk mengirim konten apa pun yang mereka inginkan.
zzzzBov
2
@zzzzBov Ya, saya memvalidasinya dengan php, dan juga menggunakan pernyataan persiapan, satu-satunya hal yang perlu dikhawatirkan adalah pengguna yang barley tahu cara menggunakan browser web. lol
Arian Faurtosh

Jawaban:

636

Menambahkan sebuah minatribut

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

Quentin
sumber
37
Ini berfungsi untuk panah pemilih, tetapi memungkinkan mengetikkan angka negatif
David Burton
2
Mengubah atribut menjadi min="0.000001"akan membantu dalam banyak kasus. Lebih dari 6 tempat desimal, JavaScript akan mengubahnya menjadi format eksponen.
MarkMYoung
Secara default, ini hanya memungkinkan bilangan bulat tetapi tidak desimal. Lihat Mengizinkan nilai desimal .
str
118

Saya telah menemukan solusi lain untuk mencegah angka negatif.

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">
Kushal
sumber
Anda tidak dapat menambahkan angka mengambang dengan ini. Juga, stepper numerik tidak bekerja di sini juga.
hamzox
1
oninput="validity.valid||(value='');"menghentikan satu dari mengetik-ve nomor
Hello Universe
5
Ini harus ditandai sebagai jawaban yang valid karena juga mencegah pengetikan karakter "-"
JanBrus
Ini berfungsi baik jika Anda hanya perlu angka bilangan bulat positif, seperti yang saya lakukan. Terima kasih!
Boris
74

Tergantung pada seberapa tepat Anda ingin menjadi. Anda hanya ingin menerima bilangan bulat, daripada:

<input type="number" min="1" step="1">

Jika Anda ingin mengapung dengan, misalnya, dua digit setelah titik desimal:

<input type="number" min="0.01" step="0.01">

Pavlo
sumber
Tampaknya saat ini berfungsi tanpa langkah = "1" ... haruskah saya menambahkannya?
Arian Faurtosh
@Arian Anda bisa menghilangkannya selama Anda tidak menentukan maxnilai.
Pavlo
1
Langkah 1 adalah browser default, Anda baik
Stephan Muller
4
Ini tidak mencegah pengetikan nilai yang buruk lagi - jika Anda menghilangkan nilai langkah chrome mengurangi validasinya saat mengetik sehingga Anda dapat memasukkan nilai-nilai non-numerik. Dengan langkah yang ditetapkan itu hanya memungkinkan Anda mengetikkan nilai di luar kisaran min-max - masih salah, tapi lebih baik.
David Burton
min = "1" langkah = "1" masih memungkinkan saya untuk mengetik angka mengambang seperti 1.2 Bagaimana saya bisa memaksakan bilangan bulat saja?
Sam
51

Anda dapat memaksa input hanya berisi bilangan bulat positif dengan menambahkan onkeypressdi dalam inputtag.

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

Di sini, event.charCode >= 48pastikan hanya angka yang lebih besar dari atau sama dengan 0 yang dikembalikan, sementara mintag memastikan bahwa Anda dapat mencapai minimum 1 dengan menggulir di dalam bilah masukan.

Shubham Mittal
sumber
3
Di Tepi Anda dapat memasukkan "A" di ini.
Amy Blankenship
10
Anda masih dapat menempelkan angka negatif
metil
5

Anda dapat menggunakan yang berikut untuk type="number"menerima hanya angka positif:

input type="number" step="1" pattern="\d+"
Deepali
sumber
2
Bisakah Anda mencoba menjelaskan apa yang dilakukan pernyataan Anda dan mengapa itu membantu? Anda juga memiliki dua cuplikan yang berbeda. Yang mana yang benar?
Aenadon
2
dengan menambahkan atribut langkah, Anda membatasi input ke integer dan menambahkan pola memastikan setiap penggunaan bagian fraksional mendapatkan bidang ditandai sebagai tidak valid tetapi tergantung pada implementasi browser (Firefox menandai bidang sebagai merah pada input kehilangan fokus sedangkan Chrome tidak membiarkan Anda memasukkan nilai yang tidak diizinkan di tempat pertama). Seseorang harus memvalidasi ini di server / klien.
Deepali
5

Anda dapat mencegah input negatif dalam formulir input angka dengan yang berikut ini:

<input type="number" onkeyup="if(this.value<0){this.value= this.value * -1}">

Hafijur Rahman Sakib
sumber
3

Mencoba

<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">

Rogerio de Moraes
sumber
Saat Anda menentukan jenis, Anda perlu format khusus untuk peran.
Rogerio de Moraes
7
Mencoba ini dalam chrome, dan itu tidak memberlakukan pola
David Burton
Apakah ada cara jika saya menambahkan type = "text" bukan "number"?
Kapil Verma
1

Jika membutuhkan input teks , polanya juga berfungsi

<input type="text" pattern="\d+">
ABDO
sumber
1

Saya tidak dapat menemukan solusi sempurna karena beberapa pekerjaan untuk memasukkan tetapi tidak untuk salin & tempel, beberapa sebaliknya. Solusi ini bekerja untuk saya. Ini mencegah dari angka negatif, mengetik "e", salin & tempel teks "e".

buat fungsi.

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

tambahkan properti ini ke input. ini mencegah dua dari copy & paste teks non-angka, termasuk "e". Anda harus bersama-sama untuk membuat efek.

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

Jika Anda menggunakan Vue, Anda dapat merujuk jawaban ini di sini . Saya telah mengekstraknya ke dalam mixin yang dapat digunakan kembali.

Arst
sumber
0

tambahkan kode ini di tipe input Anda;

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

sebagai contoh:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />
Sakawa Bob
sumber
1
ini benar-benar membingungkan bagi siapa saja yang tidak mengerti apa yang terjadi.
RozzA
Dengan cara ini, Anda masih dapat menempelkan apa pun pada input, alfabet atau bahkan karakter khusus
Lê Gia Lễ
0

Solusi lain adalah dengan menggunakan Js untuk membuatnya positif (opsi min dapat dinonaktifkan dan tidak valid ketika pengguna mengetikkan sesuatu). Negatif jika tidak diperlukan dan acara ('keydown') juga dapat digunakan!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});
Andres Paul
sumber
0

Itu tergantung pada apakah Anda menginginkan bidang int atau float. Seperti apa keduanya nanti:

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

Field int memiliki validasi yang benar, karena minnya adalah 1. Field float menerima 0, namun; untuk mengatasinya, Anda dapat menambahkan satu validator kendala lagi :

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddle di sini.

Perhatikan bahwa tidak satu pun dari solusi ini yang sepenuhnya mencegah pengguna mencoba mengetik input yang tidak valid, tetapi Anda dapat memanggil checkValidityataureportValidity mengetahui apakah pengguna telah mengetikkan input yang valid.

Tentu saja, Anda harus tetap memiliki validasi sisi-server karena pengguna selalu dapat mengabaikan validasi sisi-klien.

kevinji
sumber
0

Coba ini:

  • Diuji dalam Angular 8
  • nilai-nilai itu positif
  • Kode ini juga menangani nulldan negitivenilai.
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />
geeth-marathi
sumber
0

Jika Anda mencoba memasukkan angka negatif, event onkeyup memblokir ini dan jika Anda menggunakan panah pada nomor input, event onblur menyelesaikan bagian itu.

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>

Chictor Chictor
sumber
-2

<input type="number" min="1" step="1">

FRabbi
sumber
-2

Dengan jenis input teks Anda dapat menggunakan ini untuk validasi yang lebih baik,

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();
Anurag
sumber
-4

Coba ini:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
pengguna10132380
sumber