การป้อนตัวเลข HTML5 - แสดงทศนิยม 2 ตำแหน่งเสมอ


103

มีวิธีใดในการจัดรูปแบบinput[type='number']ค่าเพื่อให้แสดงทศนิยม 2 ตำแหน่งเสมอ?

ตัวอย่าง: ฉันต้องการจะดูแทน0.000

คำตอบ:


62

แก้ไขตามคำแนะนำและเพิ่ม jQuery เพื่อบังคับรูปแบบเป็นจำนวนเต็ม:

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

step = '0.01' ใช้ไม่ได้สำหรับฉันใน Chrome 66.0 parseFloat ทำงานได้อย่างมีเสน่ห์ robot_speed = parseFloat(robot_speed).toFixed(2)
05032 Mendicant Bias

เยี่ยมมาก! คุณสามารถเพิ่มรหัสนี้ลงในchangeวิธีการเพื่อเรียกใช้ทุกครั้งที่มีการเปลี่ยนแปลงฟิลด์: stackoverflow.com/a/58502237/2056125
mhellmeier

60

คุณทำไม่ได้จริงๆ แต่คุณมาได้ครึ่งทางแล้ว:

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


16
สิ่งนี้ใช้ไม่ได้ใน Chrome 55.0.2883.75 หากฉันสร้างองค์ประกอบแบบฟอร์มให้วางมาร์กอัปด้านบนด้านในพิมพ์ "1200" ลงในอินพุตและแท็บตีห่างจากองค์ประกอบข้อความที่แสดงจะยังคงเป็น "1200" ไม่ใช่ "1200.00"
Rick Glos

8
ทั้งหมดนี้ดูเหมือนจะเป็นการควบคุมสิ่งที่ลูกศรขั้นตอนทำ การตั้งค่า 1/3 จะไม่ จำกัด ผลลัพธ์เป็น 2 ทศนิยม
Sonic Soul

ใช้ไม่ได้กับ Chrome เวอร์ชัน 78.0.3904.108 (รุ่นอย่างเป็นทางการ) (64 บิต)
Fasco

13

การใช้แอตทริบิวต์จะเปิดใช้งานได้step ไม่เพียง แต่กำหนดจำนวนรอบที่ควรจะหมุนเวียนเท่านั้น แต่ยังรวมถึงตัวเลขที่อนุญาตด้วย การใช้step="0.01" ควรทำเคล็ดลับ แต่อาจขึ้นอยู่กับว่าเบราว์เซอร์ปฏิบัติตามมาตรฐานอย่างไร

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


7
ไม่ได้ผลสำหรับฉัน ถ้าคลิกขึ้นไป 5.01 แล้วลงมันขึ้นว่า 5 ไม่ใช่ 5.00 ใน Chrome 72
gman

หากคุณกำลังมองหาการตีความตัวเลขอย่างเคร่งครัดนี่คือพฤติกรรมที่ถูกต้อง "5.00" คือสตริง
Dissident Rage

1
ไม่เกี่ยวข้อง คำถามนี้ต้องการแสดงทศนิยม 2 ตำแหน่งเสมอและคำตอบนี้ไม่ได้ทำเช่นนั้น
gman

จากนั้นพวกเขากำลังมองหาinput[type="text"]ระฆังและนกหวีดพื้นเมืองทั้งหมดที่มาพร้อมกับinput[type="number"]การจำลองใหม่อย่างละเอียดหรือเปลี่ยนฟิลด์นี้เป็นช่องอื่นเพื่อแสดงค่าขึ้นอยู่กับสถานะขององค์ประกอบ
Dissident Rage

8

โซลูชันที่ใช้ input="number" step="0.01"งานได้ดีสำหรับฉันใน Chrome อย่างไรก็ตามไม่สามารถใช้งานได้ในบางเบราว์เซอร์โดยเฉพาะ Frontmotion Firefox 35 ในกรณีของฉัน .. ซึ่งฉันต้องสนับสนุน

วิธีแก้ปัญหาของฉันคือ jQuery ด้วยปลั๊กอิน jQuery Mask ของ Igor Escobar ดังต่อไปนี้:

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

วิธีนี้ใช้งานได้ดีแน่นอนว่าควรตรวจสอบค่าที่ส่งในภายหลัง :) หมายเหตุหากฉันไม่จำเป็นต้องทำสิ่งนี้เพื่อความเข้ากันได้ของเบราว์เซอร์ฉันจะใช้คำตอบด้านบนโดย @Rich Bradshaw


2
ไม่แน่ใจว่าทำไมจึงถูกลดคะแนนลง .. ทำให้ฉันประหลาดใจมาก ดังที่ฉันได้กล่าวไว้ในคำตอบของฉันนี่เป็นทางเลือกอื่นสำหรับผู้ที่ (เช่นฉัน) ติดอยู่ที่รองรับเบราว์เซอร์ซึ่งคำตอบอื่นไม่ได้ผล และฉันรู้ว่ามันใช้งานได้เพราะตอนนี้อยู่ในระหว่างการผลิตและทำงาน!
little_birdie

Javascript ในกรณีนี้ควรเป็นทางเลือกไม่ใช่พฤติกรรมเริ่มต้น หากไม่มีฟังก์ชันนี้แสดงว่าการเชื่อมต่อ Javascript เข้ากับฟังก์ชันนั้นเหมาะสม คุณสามารถตรวจสอบโดยการทดสอบถ้าใส่ของtypeแอตทริบิวต์หรือnumber textหากส่งคืนtextแม้ว่า HTML จะเขียนว่าnumberเบราว์เซอร์ก็ไม่รองรับประเภทนั้นและการเชื่อมโยงพฤติกรรมนี้เข้ากับมันเป็นการกระทำที่เหมาะสม
Dissident Rage

หากคุณระบุว่าในความคิดเห็นฉันจะแก้ไขคำตอบของฉันเพื่อรวมฟังก์ชันนั้นไว้ด้วย แอปพลิเคชั่นส่วนใหญ่ในปัจจุบันไม่สามารถทำงานได้เลยหากไม่มี js .. หรือแทบจะไม่ทำงาน .. ดังนั้นมันจึงกลายเป็นที่สงสัย แต่ฉันยอมรับว่าการตรวจสอบจะช่วยปรับปรุงคำตอบ ฉันกำลังเดินทาง.. ฉันจะแก้ไขเมื่อฉันกลับมา
little_birdie

5

จากคำตอบนี้จาก @Guilherme Ferreira คุณสามารถเรียกใช้parseFloatเมธอดนี้ได้ทุกครั้งที่มีการเปลี่ยนแปลงฟิลด์ ดังนั้นค่าจะแสดงทศนิยมสองตำแหน่งเสมอแม้ว่าผู้ใช้จะเปลี่ยนค่าด้วยการพิมพ์ตัวเลขด้วยตนเองก็ตาม

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


จะใช้ได้เฉพาะเมื่อองค์ประกอบสูญเสียโฟกัส หากผู้ใช้คลิกปุ่มส่งทันทีหลังจากกรอกข้อมูลในช่องป้อนข้อมูลผู้ใช้จะไม่เห็นค่าที่แก้ไขซึ่งอาจทำให้เข้าใจผิดได้
รวม Newbie

ฉันไม่แน่ใจ 100% แต่ฉันคิดว่าchange()ฟังก์ชันนี้จะถูกเรียกใช้ในช่วงเวลาเล็ก ๆ ระหว่างการป้อนข้อมูลของผู้ใช้และการคลิกปุ่มส่ง ดังนั้นสิ่งนี้ไม่ควรเป็นปัญหา
mhellmeier

ใช่มันเปลี่ยนไปอย่างแน่นอน แต่ผู้ใช้ไม่รู้สิ่งนั้นจึงอาจทำให้เกิดความสับสนเนื่องจากผู้ใช้จะไม่เห็นค่าที่แก้ไขก่อนที่จะส่งในทันที แม้ว่านี่อาจไม่ใช่ปัญหาสำหรับผู้ใช้ส่วนใหญ่
Total Newbie

3

วิธีนี้จะบังคับใช้ทศนิยมสูงสุด 2 ตำแหน่งโดยไม่ต้องปัดเศษเป็น 2 ตำแหน่งโดยอัตโนมัติหากผู้ใช้พิมพ์ไม่เสร็จ

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

หากคุณมาที่นี่เพียงแค่สงสัยว่าจะจำกัด ทศนิยม 2 ตำแหน่งได้อย่างไรฉันมีวิธีแก้ปัญหาจาวาสคริปต์ดั้งเดิม:

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

โปรดทราบว่าสิ่งนี้ไม่สามารถ AFAIK ป้องกันข้อผิดพลาดของ Chrome นี้ด้วยการป้อนตัวเลข


1

ฉันรู้ว่านี่เป็นคำถามเก่า แต่สำหรับฉันแล้วดูเหมือนว่าไม่มีคำตอบใดที่จะตอบคำถามที่ถูกถามดังนั้นหวังว่านี่จะช่วยใครบางคนในอนาคต

ใช่คุณสามารถแสดงทศนิยม 2 ตำแหน่งได้ตลอดเวลา แต่น่าเสียดายที่ไม่สามารถทำได้ด้วยแอตทริบิวต์องค์ประกอบเพียงอย่างเดียวคุณต้องใช้ JavaScript

ฉันควรชี้ให้เห็นว่าสิ่งนี้ไม่เหมาะสำหรับตัวเลขจำนวนมากเนื่องจากจะบังคับให้เลขศูนย์ต่อท้ายเสมอดังนั้นผู้ใช้จะต้องเลื่อนเคอร์เซอร์ไปข้างหลังแทนที่จะลบอักขระเพื่อตั้งค่าที่มากกว่า 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

นี่คือตัวจัดรูปแบบด่วนใน JQuery โดยใช้.toFixed(2)ฟังก์ชันสำหรับทศนิยมสองตำแหน่ง

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

จุดด้อย: คุณต้องเรียกสิ่งนี้ทุกครั้งที่เปลี่ยนหมายเลขอินพุตเพื่อฟอร์แมตใหม่

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

หมายเหตุ: ด้วยเหตุผลบางประการแม้ว่าอินพุตจะเป็นประเภท 'number' jQuery val()จะส่งคืนสตริง ดังนั้นparseFloat().


0

แนวทางที่ฉันต้องการซึ่งใช้dataแอตทริบิวต์เพื่อรักษาสถานะของตัวเลข:

<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

คำตอบด้านบนให้วิธีแก้ปัญหาแก่ฉัน แต่ฉันไม่ชอบที่การป้อนข้อมูลของผู้ใช้มีการเปลี่ยนแปลงทันทีดังนั้นฉันจึงเพิ่มความล่าช้าซึ่งในความคิดของฉันก่อให้เกิดประสบการณ์การใช้งานที่ดีขึ้น

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

คุณสามารถลองท่อนี้
RamakanthReddy Kowdampalli


-3

ดูสิ่งนี้ :

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

5
ขั้นตอนนี้ใช้ได้ แต่ไม่ใช่การจัดรูปแบบ หากคุณต้องการทศนิยม 2 ตำแหน่งและมีคนป้อน (หรือหมุนไปที่) "0.1" มันจะอยู่ "0.1" (แทนค่าที่ต้องการคือ "0.01") ในทุกเบราว์เซอร์ ตัวยึดจะใช้งานได้กับสภาพว่างเท่านั้น (ไม่ใช่รูปแบบด้วย)
MC9000

-3

นี่คือคำตอบที่ถูกต้อง:

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


4
นี่เป็นแนวทางที่ดีกว่าและทันสมัยกว่าที่คำตอบอื่น ๆ อีกมากมาย แต่ยังไม่ใส่เลขศูนย์ต่อท้ายสิ่งที่ป้อน
pcnate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.