HTML5数値入力-常に小数点以下2桁を表示


103

input[type='number']常に小数点以下2桁を表示するように値をフォーマットする方法はありますか?

例:の0.00代わりに見たい0

回答:


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.00」ではなく「1200」のままです。
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までクリックして次にクリックすると、Chrome 72では5.00ではなく5と表示されます
gman

厳密に数値の解釈を探している場合、これは正しい動作です。「5.00」は文字列です。
反逆の怒り

1
無関係。質問は常に小数点以下2桁を表示することですが、この回答はそれを行いません。
gman

次に、完全に再実装されたinput[type="text"]すべてのネイティブベルとホイッスルを探します。input[type="number"]または、このフィールドを別のフィールドと交換して、要素の状態に応じて値を表示します。
反逆の怒り

8

使用するソリューション input="number" step="0.01"はChromeではうまく機能しますが、一部のブラウザーでは機能しません。具体的には、私の場合はFrontmotion Firefox 35です。

私の解決策は、次のように、Igor EscobarのjQuery Maskプラグインを使用したjQueryです。

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

この場合のJavaScriptは、デフォルトの動作ではなく、フォールバックである必要があります。機能が存在しない場合は、JavaScriptをフックするのが適切です。これは、入力のtype属性がnumberまたはであるかどうかをテストすることで確認できますtexttextHTMLがそのように書かれているにもかかわらずそれが返る場合number、ブラウザーはそのタイプをサポートしておらず、この動作をそれにフックすることは適切なアクションです。
反体制派の怒り2016

あなたがコメントでそれを示していたら、私はその機能を含めるために私の答えを修正したでしょう。最近のほとんどのアプリケーションは、jsなしではまったく機能しないか、ほとんど機能しません。しかし、私はチェックを入れることは答えを改善することに同意します。私は現在旅行中です。戻ったときに修正します。
little_birdie

5

@Guilherme Ferreiraからのこの回答に基づいてparseFloat、フィールドが変更されるたびにメソッドをトリガーできます。したがって、ユーザーが手動で数値を入力して値を変更した場合でも、値には常に小数点以下2桁が表示されます。

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


これは、要素がフォーカスを失ったときにのみ機能します。ユーザーが入力フィールドに入力した直後に送信ボタンをクリックすると、誤解を招く可能性のある修正された値が表示されません。
初心者合計

100%確実ではありませんchange()が、ユーザー入力と送信ボタンのクリックの間の短い時間に関数がトリガーされると思います。したがって、これは問題にはなりません。
mhellmeier

はい、確かに変更されますが、ユーザーはそれを知らないため、ユーザーは修正された値がすぐに送信される前に表示されないため、混乱を招く可能性があります。これはほとんどのユースケースでは問題にならないかもしれません
初心者の合計

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ソリューションがあります。

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

これは私の知る限りではないことに注意してください、数値入力でこのクロムのバグを防御してください。


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

これは、.toFixed(2)小数点以下2桁の関数を使用するJQueryのクイックフォーマッタです。

<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.01"ではなく) "0.1"のままになります。プレースホルダーは空の条件でのみ機能します(これもフォーマットではありません)
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.