提问人:Sina Sohi 提问时间:5/19/2023 最后编辑:Sina Sohi 更新时间:5/19/2023 访问量:279
更改输入字段值后,将光标保留在相同的字符之后
Keep cursor after same char after changing input field value
问:
我有一个输入字段,用户可以在其中键入数字。我有 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."
}
答:
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" />
评论