javascript - JavaScript 正则表达式:当输入字段 onChange 事件触发时,格式化字段
问题描述
我正在使用 react 16.8.2新的钩子 API。-仅供参考-
我的问题只涉及JS。
我有两个输入字段。他们只接受数字作为输入。如果用户输入/\D+/
(非数字),则该字段设置为 ''(空)。如果他输入2.3393,则该数字应始终四舍五入到小数点后两位2.34
Field1:onChange
将数字格式化为$ 32,233,233,322.24
Field2:onChange
将数字格式化为99%
. 小数位被简单地截断。
输入字段也应该能够处理e.nativeEvent.inputType
deleteContentBackward
。这样,如果用户在$ 2
并删除2
, Field1 变为空。Field2 也是如此。1%
删除%
时变为空。
到目前为止,我有这个:
const handleInputChange = function (e) {
const val = e.target.value;
const formatValue = function () {
if (/.*\d?\.\d*/.test(val)) return val.replace(/(?<=\d?\.\d*)\..*/g, '');
return +val.replace(/\$\s?|(,+)|%/g, '');
};
if (formatValue()) {
if (fieldSuffix === 'Percentage') {
if (e.nativeEvent.inputType === 'deleteContentBackward') return setVal(`${formatValue()}%`.replace(/^\d%$|\d(?=%)/, ''));
return setVal(`${formatValue()}%`);
}
if (fieldSuffix === 'Dollars') return setVal(`$ ${formatValue()}`.replace(/\B(?=(\d{3})+(?!\d))/g, ','));
return setVal(formatValue());
}
return setVal('');
};
return (
<input
value={val}
onChange={handleInputChange}
/>
)
当用户输入 single 时,它不起作用.
。$
为每次.
击键添加。/\D+/
不处理用户进入的情况。%
Field2 小数位截断情况也不处理。我还可以想到其他未处理的情况。
我的代码越来越复杂。这种方法并不优雅。请帮忙。
解决方案
以下代码运行良好。
const handleInputChange = function (e) {
const formatValue = function () {
// Remove non-digit, except '.' and remove everything beginning from second decimal '.'
return e.target.value.replace(/[^0-9.]|(?<=^[^.]*\.[^.]*)\..*/g, '');
};
if (formatValue()) {
if (fieldSuffix === 'Percentage') {
// Percentage decimal truncated
const truncatedPercentage = formatValue().replace(/\..*/, '');
if (e.nativeEvent.inputType === 'deleteContentBackward') return setVal(`${formatValue()}%`.replace(/^\d%$|(\d|\.)(?=%)/, ''));
return setVal(`${truncatedPercentage}%`);
}
if (fieldSuffix === 'Dollars') {
// Truncated to two decimal places, not rounded
const truncatedDollar = formatValue().replace(/(?<=\.\d{2}).*/, '');
// Format and insert ','
return setVal(`$ ${truncatedDollar}`.replace(/\B(?=(\d{3})+(?!\d))/g, ','));
}
}
return setVal('');
};
我还是觉得这段代码有很多冗余和未处理的情况
推荐阅读
- jquery - jQuery - slice() 函数在 Microsoft Edge 上从 1 而不是 0 开始计数
- ruby-on-rails - API 请求不与 rest-client 一起使用,但与 Faraday/cURL 一起使用
- javascript - 事件循环更喜欢微任务队列而不是回调队列?
- c++ - 如何调试 bazel 编译 C++ 代码?
- php - 选择框的组件在 laravel 中的视图格式中不起作用
- php - 下载时传输的 fopen 字节
- r - 从数据框中以“>”分隔的文本行中提取第一个和最后一个字符串的问题
- android - 上下文操作菜单位于片段中操作栏上方
- android - 添加航点以在 Waze 地图中导航
- reinforcement-learning - Q-learning,如何选择实际给予最多奖励的动作?