Input Angka HTML5 - Selalu tampilkan 2 tempat desimal

103

Apakah ada cara untuk memformat input[type='number']nilai agar selalu menampilkan 2 tempat desimal?

Contoh: Saya ingin melihat, 0.00bukan 0.

Guilherme Ferreira
sumber

Jawaban:

62

Dipecahkan mengikuti saran dan menambahkan sepotong jQuery untuk memaksa format pada bilangan bulat:

parseFloat($(this).val()).toFixed(2)
Guilherme Ferreira
sumber
step = '0.01' tidak berfungsi untuk saya di Chrome 66.0 parseFloat berfungsi seperti pesona. robot_speed = parseFloat(robot_speed).toFixed(2)
05032 Mendicant Bias
Bagus! Anda dapat menambahkan kode ini ke dalam changemetode untuk memicunya setiap kali bidang berubah: stackoverflow.com/a/58502237/2056125
mhellmeier
60

Anda tidak bisa benar-benar, tetapi Anda setengah langkah mungkin:

<input type='number' step='0.01' value='0.00' placeholder='0.00' />

Bradshaw kaya
sumber
16
Ini tidak berfungsi di Chrome 55.0.2883.75. Jika saya membuat elemen formulir, tempatkan markup di atas di dalam, ketik '1200' ke input dan tekan tab menjauh dari elemen, teks yang ditampilkan masih '1200' dan bukan '1200.00'.
Rick Glos
8
semua yang tampaknya dilakukan adalah mengontrol apa yang dilakukan panah langkah. menetapkan nilai 1/3 tidak akan membatasi hasil menjadi 2 desimal
Sonic Soul
Tidak berfungsi untuk Chrome Versi 78.0.3904.108 (Versi Resmi) (64-bit)
Fasco
13

Menggunakan stepatribut akan mengaktifkannya . Ini tidak hanya menentukan berapa banyak itu seharusnya siklus, tapi juga angka yang diizinkan. Menggunakan step="0.01" harus melakukan triknya, tetapi ini mungkin tergantung pada bagaimana browser mematuhi standar.

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

Kemarahan Pembangkang
sumber
7
tidak bekerja untuk saya. Jika saya mengklik hingga 5,01 dan kemudian turun dikatakan 5 bukan 5,00 di Chrome 72
gman
Jika Anda mencari interpretasi numerik yang ketat, ini adalah perilaku yang benar, "5.00" adalah string.
Dissident Rage
1
tidak relevan. Pertanyaannya adalah mencari untuk selalu menampilkan 2 tempat desimal dan jawaban ini tidak melakukannya.
gman
Kemudian mereka mencari input[type="text"]dengan semua lonceng dan peluit asli yang datang dengan input[type="number"]benar - benar reimplimented untuknya, atau menukar bidang ini dengan yang lain untuk menampilkan nilai bergantung pada status elemen.
Kemarahan Pembangkang
8

Solusi yang digunakan input="number" step="0.01"bekerja dengan baik untuk saya di Chrome, namun tidak berfungsi di beberapa browser, khususnya Frontmotion Firefox 35 dalam kasus saya .. yang harus saya dukung.

Solusi saya adalah menggunakan jQuery dengan plugin jQuery Mask Igor Escobar, sebagai berikut:

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

Ini berfungsi dengan baik, tentu saja seseorang harus memeriksa nilai yang dikirimkan sesudahnya :) CATATAN, jika saya tidak harus melakukan ini untuk kompatibilitas browser, saya akan menggunakan jawaban di atas oleh @Rich Bradshaw.

little_birdie
sumber
2
Tidak yakin mengapa ini tidak disukai .. saya sangat terkejut. Seperti yang saya katakan dalam jawaban saya, ini adalah solusi alternatif hanya untuk mereka yang (seperti saya) terjebak pada browser pendukung di mana jawaban lain tidak berfungsi. Dan saya tahu itu berhasil karena saat ini sedang dalam produksi dan bekerja!
little_birdie
Javascript dalam hal ini harus berupa fallback, bukan perilaku default. Jika fungsinya tidak ada, maka menghubungkan Javascript ke sana sudah sesuai. Anda dapat memeriksanya dengan menguji apakah typeatribut input adalah numberatau text. Jika ia kembali textmeskipun HTML ditulis seperti itu numbermaka browser tidak mendukung jenis itu, dan mengaitkan perilaku ini padanya adalah tindakan yang tepat.
Pembangkang Kemarahan
Jika Anda telah menunjukkan bahwa dalam komentar saya akan mengubah jawaban saya untuk menyertakan fungsionalitas itu. Sebagian besar aplikasi saat ini tidak berfungsi sama sekali tanpa js .. atau hampir tidak berfungsi .. sehingga menjadi diperdebatkan. Tetapi saya setuju bahwa memberi tanda centang akan meningkatkan jawabannya. Saat ini saya sedang bepergian .. Saya akan mengubahnya ketika saya kembali.
little_birdie
5

Berdasarkan ini jawaban dari @Guilherme Ferreira Anda dapat memicu parseFloatmetode setiap kali perubahan lapangan. Oleh karena itu, nilai selalu menunjukkan dua tempat desimal, meskipun pengguna mengubah nilai dengan mengetik angka secara manual.

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

mhellmeier
sumber
Ini hanya berfungsi ketika elemen kehilangan fokus. jika pengguna langsung mengklik tombol kirim setelah mengisi kolom input, dia tidak akan melihat nilai yang dikoreksi yang mungkin menyesatkan.
Total Newbie
Saya tidak 100% yakin tetapi saya pikir change()fungsi tersebut akan dijalankan dalam waktu singkat antara input pengguna dan klik tombol kirim. Oleh karena itu, ini seharusnya tidak menjadi masalah.
mhellmeier
Ya, itu memang berubah tetapi pengguna tidak akan mengetahuinya sehingga dapat menyebabkan kebingungan karena pengguna tidak akan melihat nilai yang dikoreksi sebelum langsung dikirim. Meskipun ini mungkin tidak menjadi masalah bagi kebanyakan kasus penggunaan
Total Newbie
3

Ini berfungsi untuk memaksakan maksimal 2 tempat desimal tanpa pembulatan otomatis menjadi 2 tempat jika pengguna belum selesai mengetik.

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)
   }
}
SuperCodeBrah
sumber
3

Jika Anda mendarat di sini hanya bertanya-tanya bagaimana cara membatasi hingga 2 tempat desimal, saya memiliki solusi javascript asli:

Javascript:

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

Perhatikan bahwa ini tidak dapat AFAIK, bertahan dari bug chrome ini dengan input nomor.

Stephen Paul
sumber
1

Saya tahu ini adalah pertanyaan lama, tetapi bagi saya tampaknya tidak ada dari jawaban ini yang menjawab pertanyaan yang ditanyakan jadi semoga ini akan membantu seseorang di masa depan.

Ya, Anda selalu dapat menampilkan 2 tempat desimal, tetapi sayangnya ini tidak dapat dilakukan dengan atribut elemen saja, Anda harus menggunakan JavaScript.

Saya harus menunjukkan bahwa ini tidak ideal untuk angka besar karena akan selalu memaksa angka nol yang tertinggal, jadi pengguna harus memindahkan kursor ke belakang alih-alih menghapus karakter untuk menetapkan nilai yang lebih besar dari 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" />

Verno
sumber
1

Ini adalah pemformat cepat di JQuery menggunakan .toFixed(2)fungsi untuk dua tempat desimal.

<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));
}

Kekurangan: Anda harus memanggil ini setiap kali nomor masukan diubah untuk memformatnya.

// 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);
});

Catatan: untuk beberapa alasan meskipun input bertipe 'number', jQuery val()mengembalikan string. Oleh karena itu parseFloat().

kblocks
sumber
0

Pendekatan pilihan saya, yang menggunakan dataatribut untuk menahan status nomor:

<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

})
nikk wong
sumber
0

Jawaban teratas memberi saya solusi tetapi saya tidak suka input pengguna segera diubah jadi saya menambahkan penundaan yang menurut saya berkontribusi pada pengalaman pengguna yang lebih baik

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/

Total Newbie
sumber
-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
sumber
Anda dapat mencoba pipa ini
RamakanthReddy Kowdampalli
-1

ui-number-maskuntuk sudut, https://github.com/assisrafael/angular-input-masks

hanya ini:

<input ui-number-mask ng-model="valores.irrf" />

Jika Anda memberi nilai satu per satu ....

need: 120,01

digit per digit

 = 0,01
 = 0,12
 = 1,20
 = 12,00
 = 120,01 final number.
Raphael Vitor
sumber
Tidak ada pertanyaan tentang Angular.
Dale K
-3

Coba lihat ini :

 <input type="number" step="0.01" />
chris
sumber
5
Ini tidak masalah untuk melangkah, tetapi tidak untuk memformat. Jika Anda menginginkan 2 tempat desimal dan seseorang memasukkan (atau memutar ke) "0,1", itu akan tetap "0,1" (bukan yang diinginkan "0,01") di semua browser. Placeholder hanya berfungsi untuk kondisi kosong (ini juga bukan format)
MC9000
-3

Ini jawaban yang benar:

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

Alex
sumber
4
Ini adalah pendekatan yang lebih baik dan lebih modern yang banyak dari jawaban lain tetapi masih tidak menempatkan nol di belakang apa yang dimasukkan
pcnate