Nhập số HTML5 - Luôn hiển thị 2 chữ số thập phân


103

Có cách nào để định dạng một input[type='number']giá trị để luôn hiển thị 2 chữ số thập phân không?

Ví dụ: Tôi muốn xem 0.00thay vì 0.

Câu trả lời:


62

Đã giải quyết theo các đề xuất và thêm một đoạn jQuery để buộc định dạng trên số nguyên:

parseFloat($(this).val()).toFixed(2)

step = '0.01' không hoạt động đối với tôi trên Chrome 66.0 parseFloat hoạt động như một sự quyến rũ. robot_speed = parseFloat(robot_speed).toFixed(2)
05032 Mendicant Bias

Tuyệt quá! Bạn có thể thêm mã này vào các changephương pháp để kích hoạt nó mỗi khi lĩnh vực này thay đổi: stackoverflow.com/a/58502237/2056125
mhellmeier

60

Bạn thực sự không thể, nhưng bạn đi được nửa bước có thể là:

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


16
Điều này không hoạt động trong Chrome 55.0.2883.75. Nếu tôi tạo một phần tử biểu mẫu, hãy đặt phần đánh dấu ở trên vào bên trong, nhập '1200' vào tab đầu vào và nhấn cách xa phần tử, văn bản được hiển thị vẫn là '1200' chứ không phải '1200,00'.
Rick Glos

8
tất cả điều này dường như làm là kiểm soát những gì các mũi tên bước làm. thiết lập một giá trị 1/3 sẽ không giới hạn kết quả đến 2 số thập phân
Sonic linh hồn

Nó không hoạt động với Phiên bản Chrome 78.0.3904.108 (Bản dựng chính thức) (64-bit)
Fasco

13

Sử dụng stepthuộc tính sẽ kích hoạt nó . Nó không chỉ xác định số lượng nó phải quay vòng mà còn cả những con số cho phép. Sử dụng step="0.01" nên thực hiện thủ thuật nhưng điều này có thể phụ thuộc vào cách trình duyệt tuân thủ tiêu chuẩn.

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


7
không hiệu quả với tôi. Nếu tôi nhấp lên 5,01 và sau đó nhấp xuống, nó cho biết 5 không phải 5,00 trong Chrome 72
gman

Nếu bạn đang tìm kiếm một diễn giải số đúng thì đây là hành vi chính xác, "5.00" là một chuỗi.
Cơn thịnh nộ bất đồng chính kiến

1
không liên quan. Câu hỏi đang tìm cách luôn hiển thị 2 chữ số thập phân và câu trả lời này không làm được điều đó.
gman

Sau đó, họ đang tìm kiếm input[type="text"]với tất cả chuông và còi bản địa đi kèminput[type="number"] được tái thiết kế kỹ lưỡng cho nó hoặc hoán đổi trường này cho trường khác để hiển thị giá trị tùy thuộc vào trạng thái phần tử.
Cơn thịnh nộ bất đồng chính kiến

8

Các giải pháp sử dụng input="number" step="0.01"hoạt động tốt cho tôi trong Chrome, tuy nhiên không hoạt động trong một số trình duyệt, cụ thể là Frontmotion Firefox 35 trong trường hợp của tôi .. mà tôi phải hỗ trợ.

Giải pháp của tôi là jQuery với plugin jQuery Mask của Igor Escobar, như sau:

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

Điều này hoạt động tốt, tất nhiên người ta nên kiểm tra giá trị đã gửi sau đó :) LƯU Ý, nếu tôi không phải làm điều này để tương thích với trình duyệt, tôi sẽ sử dụng câu trả lời ở trên của @Rich Bradshaw.


2
Không chắc tại sao điều này lại bị từ chối .. tôi rất ngạc nhiên. Như tôi đã nói trong câu trả lời của mình, đây là một giải pháp thay thế chỉ dành cho những người (như tôi) đang gặp khó khăn trong việc hỗ trợ các trình duyệt mà câu trả lời khác không hoạt động. Và tôi biết nó hoạt động vì nó hiện đang được sản xuất và làm việc!
little_birdie

Javascript trong trường hợp này phải là một dự phòng, không phải là hành vi mặc định. Nếu chức năng không tồn tại, thì nối Javascript vào nó là phù hợp. Bạn có thể kiểm tra điều này bằng cách kiểm tra xem typethuộc tính của đầu vào là numberhoặc text. Nếu nó trả về textmặc dù HTML được viết như vậy numberthì trình duyệt không hỗ trợ kiểu đó và việc nối hành vi này với nó là một hành động thích hợp.
Cơn thịnh nộ bất đồng chính kiến

Nếu bạn đã chỉ ra rằng trong một bình luận, tôi sẽ sửa đổi câu trả lời của mình để bao gồm chức năng đó. Hầu hết các ứng dụng ngày nay hoặc không hoạt động mà không có js .. hoặc hầu như không hoạt động .. vì vậy nó đang trở nên tranh luận. Nhưng tôi đồng ý rằng đặt một tấm séc sẽ cải thiện câu trả lời. Tôi hiện đang đi du lịch .. Tôi sẽ sửa đổi nó khi tôi quay lại.
little_birdie

5

Dựa trên câu trả lời này từ @Guilherme Ferreira, bạn có thể kích hoạt parseFloatphương pháp mỗi khi trường thay đổi. Do đó, giá trị luôn hiển thị hai chữ số thập phân, ngay cả khi người dùng thay đổi giá trị bằng cách nhập thủ công một số.

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


Điều này chỉ hoạt động khi phần tử bị mất tiêu điểm. nếu người dùng nhấp ngay vào nút gửi sau khi điền vào trường nhập, họ sẽ không thấy giá trị đã sửa có thể gây hiểu lầm.
Tổng số thành viên mới

Tôi không chắc chắn 100% nhưng tôi nghĩ rằng change()chức năng này sẽ được kích hoạt trong một khoảng thời gian nhỏ giữa người dùng nhập và nhấp vào nút gửi. Do đó, đây không phải là một vấn đề.
mhellmeier

Đúng, nó thực sự thay đổi nhưng người dùng sẽ không biết điều đó, do đó có thể dẫn đến nhầm lẫn vì người dùng sẽ không thấy giá trị đã sửa trước khi nó được gửi ngay lập tức. Mặc dù đây có thể không phải là vấn đề đối với hầu hết các cách sử dụng
Total Newbie

3

Điều này hoạt động để thực thi tối đa 2 chữ số thập phân mà không tự động làm tròn thành 2 chữ số nếu người dùng chưa nhập xong.

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

3

Nếu bạn đã hạ cánh ở đây chỉ tự hỏi làm thế nào để giới hạn đến 2 chữ số thập phân, tôi có một giải pháp javascript gốc:

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

Lưu ý rằng điều này có thể không AFAIK, bảo vệ chống lại này lỗi chrome với các đầu vào số.


1

Tôi biết đây là một câu hỏi cũ, nhưng đối với tôi dường như không có câu trả lời nào trong số này trả lời được câu hỏi đang được hỏi vì vậy hy vọng điều này sẽ giúp ích cho ai đó trong tương lai.

Có, bạn luôn có thể hiển thị 2 chữ số thập phân, nhưng tiếc là không thể thực hiện chỉ với các thuộc tính phần tử, bạn phải sử dụng JavaScript.

Tôi nên chỉ ra rằng điều này không lý tưởng cho các số lớn vì nó sẽ luôn buộc các số không ở cuối, vì vậy người dùng sẽ phải di chuyển con trỏ trở lại thay vì xóa các ký tự để đặt giá trị lớn hơn 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" />


1

Đây là một định dạng nhanh trong JQuery sử dụng .toFixed(2)hàm cho hai chữ số thập phân.

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

Nhược điểm: bạn phải gọi điều này mỗi khi số đầu vào được thay đổi để định dạng lại nó.

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

Lưu ý: vì một số lý do, ngay cả khi đầu vào thuộc loại 'số', jQuery val()sẽ trả về một chuỗi. Do đó parseFloat().


0

Cách tiếp cận ưa thích của tôi, sử dụng datacác thuộc tính để giữ trạng thái của số:

<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

})

0

Câu trả lời hàng đầu đã cho tôi giải pháp nhưng tôi không thích rằng đầu vào của người dùng bị thay đổi ngay lập tức, vì vậy tôi đã thêm độ trễ, theo ý kiến ​​của tôi, góp phần mang lại trải nghiệm người dùng tốt hơn

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/


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

Bạn có thể thử ống này
RamakanthReddy Kowdampalli


-3

Hãy xem cái này :

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

5
Điều này là ổn cho bước, nhưng không định dạng. Nếu bạn muốn có 2 chữ số thập phân và ai đó nhập (hoặc xoay thành) "0,1", nó sẽ giữ nguyên "0,1" (thay vì "0,01" mong muốn) trong tất cả các trình duyệt. Trình giữ chỗ chỉ hoạt động cho điều kiện trống (nó cũng không phải là một định dạng)
MC9000

-3

Đây là câu trả lời chính xác:

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


4
Đây là một cách tiếp cận tốt hơn và hiện đại hơn nhiều trong những câu trả lời khác nhưng vẫn không đưa số không trailing vào những gì được nhập
pcnate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.