咨询:实现波斯语输入时的千位分隔功能兼容方案
搞定波斯语数字的千位分隔兼容问题
嘿,我明白你的困扰了!你现在的代码只能给拉丁数字加千位分隔,对波斯语数字没反应,核心原因是正则表达式只认0-9这些拉丁数字,完全没考虑波斯语的۰-۹字符。我给你调整一下代码,让它完美兼容波斯语数字:
首先,我们需要两个小工具函数来做波斯语和拉丁数字的互相转换,这样就能复用原来成熟的千位分隔逻辑,避免重新写复杂的正则:
// 把波斯语数字转成拉丁数字 function persianToLatin(numStr) { return numStr.replace(/[۰-۹]/g, char => { return char.charCodeAt(0) - 1728; }); } // 把拉丁数字转回波斯语数字 function latinToPersian(numStr) { return numStr.replace(/[0-9]/g, char => { return String.fromCharCode(parseInt(char) + 1728); }); }
然后修改原来的输入处理逻辑,先把输入的波斯语数字转成拉丁数字处理分隔,再转回波斯语数字输出:
$('input.number').keyup(function(event) { // 跳过方向键,避免干扰光标移动 if (event.which >= 37 && event.which <= 40) return; $(this).val(function(index, currentValue) { // 第一步:把波斯语数字转成拉丁数字,同时过滤掉所有非数字字符 const latinNumber = persianToLatin(currentValue).replace(/\D/g, ""); // 第二步:给拉丁数字添加千位分隔 const formattedLatin = latinNumber.replace(/\B(?=(\d{3})+(?!\d))/g, ","); // 第三步:把处理好的数字转回波斯语数字 return latinToPersian(formattedLatin); }); });
HTML部分不用改,还是你原来的那段:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input class="form-control number" type="text" value="0" name="subjectvalue" id="txt_subjectvalue">
为什么这么做?
- 直接复用了原来针对拉丁数字的千位分隔正则,避免了重新编写适配波斯语数字的复杂正则,逻辑更清晰
- 双向转换确保输入波斯语数字时,输出的也是带分隔符的波斯语数字,符合用户的使用习惯
- 同时兼容拉丁数字和波斯语数字输入,不管用户用哪种数字都能正常工作
内容的提问来源于stack exchange,提问作者mdehghani
相关产品推荐
相关产品推荐

