更改输入字段值后,将光标保留在相同的字符之后

Keep cursor after same char after changing input field value

提问人:Sina Sohi 提问时间:5/19/2023 最后编辑:Sina Sohi 更新时间:5/19/2023 访问量:279

问:

我有一个输入字段,用户可以在其中键入数字。我有 javascript 代码,可以将数字重新格式化为货币格式。我想将光标位置保留在相同的字符之后。

用户在光标位置键入 9 的示例:

输入值:12.3[游标]45.678,50

新输入值:123.9[游标]45.678,50

输入值:123[cursor].456,50

新输入值:1.239。[光标]456,50

我该怎么做?目前,光标将捕捉到输入字段的末尾。

输入字段:

<input type="text" class="invoiceFields invoiceDescriptionFields form-control InputStyleForms {% if description_error in form_errors %} is-invalid {% endif %}"
       id="inputDescription-{{id}}" placeholder="Beskrivelse." name="invoiceline-{{id}}-description"
       style="margin-bottom: 8px;" value="{{line.description.value|default_if_none:''}}"
       maxlength="50">

Jquuery 货币格式化程序:

$(document).on('keyup', '.invoiceFields', function () {
    $(this).val(displayInCurrencyFormat($(this).val()));
});

const displayInCurrencyFormat = (value) => {
            value = convertToDanishFloat(value);
            value = value.toString().replace(/(?!\,)\D/g, "").replace(/(?<=\,,*)\,/g, "").replace(/(?<=\,\d\d).*/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ".");
            if(value.indexOf(",") >= 0){
                // do nothing
            } else {
                value += ",00";
            }
            return value += " kr."
        }
JavaScript jQuery 输入 游标 重新格式化

评论


答:

0赞 Heiko Theißen 5/19/2023 #1

下面的代码维护输入字段的属性,以便如果光标在格式化前的第 N 位数字之后,则在格式化后也将其放在第 N 位数字之后。selectionStart

这只是这个复杂问题的起点。该函数采用数字格式,具有分组字符和小数点。为简单起见,如果用户按下数字、Delete 或 Backspace 以外的任何按钮,则光标将保持不变。parse.,

function isdigit(c) {
  return c.match(/[0-9]/);
}

function parse(s) {
  return Number(s.replaceAll(".", "")
    .replaceAll(",", "."));
}

function format(input) {
  if (isdigit(event.key) || event.key === "Backspace" || event.key === "Delete") {
    var cursor = input.selectionStart;
    var str = input.value.substring(0, cursor);
    var num = String(parse(str));
    cursor += num.length - str.length;
    input.value = Intl.NumberFormat("da").format(parse(input.value));
    for (var i = 0; i < input.value.length; i++) {
      if (cursor === 0) {
        input.selectionStart = input.selectionEnd = i;
        break;
      }
      if (isdigit(input.value[i])) cursor--;
    }
  }
}
<input onkeyup="format(this)" value="10.002" />