如何在键入时格式化输入框文本

IT技术 javascript jquery
2021-03-05 02:11:39

如何在 html 输入框中输入数字时格式化数字?

例如,我想输入数字 2000,当我输入第 4 位数字时,文本(当前显示在文本框中)将自动格式化为 2,000(带逗号)。

//my modified code based on Moob answer below

<input type="text" class="formattedNumberField" onkeyup="myFunc()">

//jQuery
$(".formattedNumberField").on('keyup', function(){
    var n = parseInt($(this).val().replace(/\D/g,''),10);
    $(this).val(n.toLocaleString());
});

function myFunc(){
// doing something else
}

虽然此代码运行完美,如 Moob Fiddle 所示,但它在我这边不起作用可能是因为我在输入框内有另一个 onkeyup 事件???

5个回答

纯 JS(无 jQuery):

var fnf = document.getElementById("formattedNumberField");
fnf.addEventListener('keyup', function(evt){
    var n = parseInt(this.value.replace(/\D/g,''),10);
    fnf.value = n.toLocaleString();
}, false);

原生 JS 示例小提琴

使用 jQuery:

$("#formattedNumberField").on('keyup', function(){
    var n = parseInt($(this).val().replace(/\D/g,''),10);
    $(this).val(n.toLocaleString());
    //do something else as per updated question
    myFunc(); //call another function too
});

使用 jQuery 示例小提琴

允许使用小数:

$("#formattedNumberField").on('keyup', function(evt){
    if (evt.which != 110 ){//not a fullstop
        var n = parseFloat($(this).val().replace(/\,/g,''),10);
        $(this).val(n.toLocaleString());
    }
});

强制性示例

onkeyup="myFunc()"从您的输入框中删除myFunc().on('keyup'我们创建函数中调用这样
2021-04-21 02:11:39
酷,我认为这个input活动可以表现得更好
2021-04-25 02:11:39
尽管 Fiddle 工作完美,但它对我来说不起作用,因为我已经有一个 onkeyup 可以在输入框中触发一个函数。我怎样才能规避这个?任何的想法?谢谢
2021-05-01 02:11:39
我已经更新了上面的问题以反映根据您的代码所做的更改。谢谢
2021-05-11 02:11:39
你使用 jQuery 还是原生 JS?最可能的解决方案是将这两个功能合二为一。更新您的问题以包含您的 keyup 功能(或发布小提琴)
2021-05-19 02:11:39

使用其他答案的一些代码位,我创建了以下工作示例。代码没有 jquery,但比其他一些示例要长一点。但是它解决了其他人遇到的很多问题。

http://jsfiddle.net/kcz4a2ca/10/

代码:

var input = document.getElementById('my_textbox');
var currentValue;

input.addEventListener('input', function(event) {
  var cursorPosition = getCaretPosition(input);
  var valueBefore = input.value;
    var lengthBefore = input.value.length;
  var specialCharsBefore = getSpecialCharsOnSides(input.value);
  var number = removeThousandSeparators(input.value);

  if (input.value == '') {
    return;
  }

  input.value = formatNumber(number.replace(getCommaSeparator(), '.'));

    // if deleting the comma, delete it correctly
  if (currentValue == input.value && currentValue == valueBefore.substr(0, cursorPosition) + getThousandSeparator() + valueBefore.substr(cursorPosition)) {
    input.value = formatNumber(removeThousandSeparators(valueBefore.substr(0, cursorPosition-1) + valueBefore.substr(cursorPosition)));
    cursorPosition--;
  }

  // if entering comma for separation, leave it in there (as well support .000)
  var commaSeparator = getCommaSeparator();
    if (valueBefore.endsWith(commaSeparator) || valueBefore.endsWith(commaSeparator+'0') || valueBefore.endsWith(commaSeparator+'00') || valueBefore.endsWith(commaSeparator+'000')) {
    input.value = input.value + valueBefore.substring(valueBefore.indexOf(commaSeparator));
  }

  // move cursor correctly if thousand separator got added or removed
  var specialCharsAfter = getSpecialCharsOnSides(input.value);
  if (specialCharsBefore[0] < specialCharsAfter[0]) {
        cursorPosition += specialCharsAfter[0] - specialCharsBefore[0];
  } else if (specialCharsBefore[0] > specialCharsAfter[0]) {
        cursorPosition -= specialCharsBefore[0] - specialCharsAfter[0];
  }
  setCaretPosition(input, cursorPosition);

  currentValue = input.value;
});

function getSpecialCharsOnSides(x, cursorPosition) {
    var specialCharsLeft = x.substring(0, cursorPosition).replace(/[0-9]/g, '').length;
  var specialCharsRight = x.substring(cursorPosition).replace(/[0-9]/g, '').length;
  return [specialCharsLeft, specialCharsRight]
}

function formatNumber(x) {
   return getNumberFormat().format(x);
}

function removeThousandSeparators(x) {
  return x.toString().replace(new RegExp(escapeRegExp(getThousandSeparator()), 'g'), "");
}

function getThousandSeparator() {
  return getNumberFormat().format('1000').replace(/[0-9]/g, '')[0];
}

function getCommaSeparator() {
  return getNumberFormat().format('0.01').replace(/[0-9]/g, '')[0];
}

function getNumberFormat() {
    return new Intl.NumberFormat();
}

/* From: http://stackoverflow.com/a/6969486/496992 */
function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

/*
** Returns the caret (cursor) position of the specified text field.
** Return value range is 0-oField.value.length.
** From: http://stackoverflow.com/a/2897229/496992
*/
function getCaretPosition (oField) {
  // Initialize
  var iCaretPos = 0;

  // IE Support
  if (document.selection) {

    // Set focus on the element
    oField.focus();

    // To get cursor position, get empty selection range
    var oSel = document.selection.createRange();

    // Move selection start to 0 position
    oSel.moveStart('character', -oField.value.length);

    // The caret position is selection length
    iCaretPos = oSel.text.length;
  }

  // Firefox support
  else if (oField.selectionStart || oField.selectionStart == '0')
    iCaretPos = oField.selectionStart;

  // Return results
  return iCaretPos;
}

/* From: http://stackoverflow.com/a/512542/496992 */
function setCaretPosition(elem, caretPos) {
    if(elem != null) {
        if(elem.createTextRange) {
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        }
        else {
            if(elem.selectionStart) {
                elem.focus();
                elem.setSelectionRange(caretPos, caretPos);
            }
            else
                elem.focus();
        }
    }
}
这是最好的答案,不会出现空字段问题,并且可以在不丢失光标位置的情况下编辑中间的数字。但是,由于不是有效数字的字符会导致错误,而不是被忽略。
2021-05-04 02:11:39
我将如何做到这一点,只用逗号而不是点作为分隔符?
2021-05-04 02:11:39
我明白了 - 它需要“en”参数。Intl.NumberFormat('en'); 此外,这显然是最好的答案 - 它解决了光标位置问题!
2021-05-10 02:11:39
你如何在这个解决方案中添加小数点?我试过这个:Intl.NumberFormat('en', { maximumFractionDigits: 2 }, { minimumFractionDigits: 2 });但不工作
2021-05-13 02:11:39
我花了很多时间为此寻找可接受的解决方案,这是迄今为止最完整的解决方案。
2021-05-16 02:11:39

试试这个插件它工作得很好http://robinherbots.github.io/jquery.inputmask/

虽然这看起来很有希望......我尽量减少插件的使用,@Moob 展示了一个完美的例子。不管怎么说,还是要谢谢你 :)
2021-04-26 02:11:39
这非常接近我想要的。会尝试一下,如果它对我有用..我会告诉你的。谢谢
2021-05-12 02:11:39

您可以使用 ngx-format-field。它是用于格式化将出现在视图中的输入值的指令。它不会操作将保存在后端的输入值。在这里查看链接

例子:

component.html:

<input type="text" formControlName="currency" [appFormatFields]="CURRENCY"
(change)="onChangeCurrency()">

component.ts

onChangeCurrency() {
this.currency.patchValue(this.currency.value);
}

看演示:在这里

根据您给出的示例,您可以使用以下内容:

$("#my_textbox").keyup(function(){
    if($("#my_textbox").val().length == 4){
        var my_val = $("#my_textbox").val();
        $("#my_textbox").val(Number(my_val).toLocaleString('en'));
    }
});

我在上面使用了 jQuery,但它也可以用纯 JS 来完成。

这里的工作示例

@Moob 你必须添加更多的 JavaScript 来验证不同的场景
2021-04-24 02:11:39
如果用户输入的内容不是数字,则为 NaN!
2021-05-17 02:11:39