Javascript 只有数字。在React中输入数字
我试图从输入中排除正负,但它出了问题:Javascript 只有数字。在React中输入数字,javascript,regex,reactjs,Javascript,Regex,Reactjs,我试图从输入中排除正负,但它出了问题: handleChange(事件){ const value=event.target.value.replace(/\+\124;-/ig',); this.setState({financialgal:value}); } 渲染输入代码: 我试着模仿你的代码,注意到对的反应有一个问题。有关解决方法,请检查此示例并亲自尝试: 您需要将其定义为普通输入(type='text'),模式仅适用于数字: <input type="text" pat
handleChange(事件){
const value=event.target.value.replace(/\+\124;-/ig',);
this.setState({financialgal:value});
}
渲染输入代码:
我试着模仿你的代码,注意到对
的反应有一个问题。有关解决方法,请检查此示例并亲自尝试:
您需要将其定义为普通输入(type='text'),模式仅适用于数字:
<input type="text" pattern="[0-9]*"
onInput={this.handleChange.bind(this)} value={this.state.financialGoal} />
这种方法的最大警告是,对于移动-->而言,键盘不是数字格式,而是普通字母格式。- 要停止键入,请使用
而不是onKeyPress
onChange
- 在
内部使用onKeyPress
意味着停止按压事件event.preventDefault()
- 由于
处理程序在keyPress
之前触发,因此必须检查按下的键(onChange
),而不是输入的当前值(event.keyCode
)event.target.value
<input value={this.state.financialGoal} onChange={event => this.setState({financialGoal: event.target.value.replace(/\D/,'')})}/>
this.setState({financialGoal:event.target.value.replace(/\D/,'')}/>
如果您想保持输入type='number'
(可能是移动设备触发数字键盘),您应该使用onInput
而不是onChange
来捕获事件更改
使用onInput
修复了在数字输入中键入文本会绕过我在onChange
中分配给它的验证的错误。一旦我将此函数固定为在onInput
中调用,它将在所有实例中触发
下面是我正在做的一个例子:
<input
type='number'
id={`player${index}Score`}
className='form-control'
pattern='[0-9]{0,5}'
onInput={(event) => this.enterScore(event, index)}
value={this.props.scoreLabel(this.state.scores[index])}
/>
this.enterScore(事件、索引)}
value={this.props.scoreLabel(this.state.scores[index])
/>
我希望这有帮助
编辑-08-03-2018:
我想出了一个更好的解决办法。在输入组件本身中使用type='tel'和模式regex
下面是我如何将其连接起来的具体细节:
class Input extends React.Component {
state = {message: '3'};
updateNumber = (e) => {
const val = e.target.value;
// If the current value passes the validity test then apply that to state
if (e.target.validity.valid) this.setState({message: e.target.value});
// If the current val is just the negation sign, or it's been provided an empty string,
// then apply that value to state - we still have to validate this input before processing
// it to some other component or data structure, but it frees up our input the way a user
// would expect to interact with this component
else if (val === '' || val === '-') this.setState({message: val});
}
render() {
return (
<input
type='tel'
value={this.state.message}
onChange={this.updateNumber}
pattern="^-?[0-9]\d*\.?\d*$"
/>
);
}
}
ReactDOM.render(<Input />, document.getElementById('main'));
类输入扩展了React.Component{
状态={消息:“3'};
updateNumber=(e)=>{
const val=e.target.value;
//如果当前值通过有效性测试,则将其应用于状态
if(e.target.validity.valid)this.setState({message:e.target.value});
//如果当前val只是一个否定符号,或者提供了一个空字符串,
//然后将该值应用于状态-我们仍然需要在处理之前验证该输入
//它可以转换为其他组件或数据结构,但它可以像用户一样释放我们的输入
//将期望与此组件交互
else如果(val==''| val=='-')这个.setState({message:val});
}
render(){
返回(
);
}
}
ReactDOM.render(,document.getElementById('main'));
我有一个关于这方面的例子,也许它会对某些人有所帮助
最近我将此解决方案用于我的应用程序
我不确定这是一个正确的解决方案,但效果很好
this.state = {
inputValue: "",
isInputNotValid: false
}
handleInputValue = (evt) => {
this.validationField(evt, "isInputNotValid", "inputValue");
}
validationField = (evt, isFieldNotValid, fieldValue ) => {
if (evt.target.value && !isNaN(evt.target.value)) {
this.setState({
[isFieldNotValid]: false,
[fieldValue]: evt.target.value,
});
} else {
this.setState({
[isFieldNotValid]: true,
[fieldValue]: "",
});
}
}
<input className={this.state.isInputNotValid ? "error" : null} type="text" onChange="this.handleInputValue" />
this.state={
输入值:“”,
isInputNotValid:false
}
handleInputValue=(evt)=>{
这个.validationField(evt,“isInputNotValid”,“inputValue”);
}
validationField=(evt,isFieldNotValid,fieldValue)=>{
if(evt.target.value&&!isNaN(evt.target.value)){
这个.setState({
[isFieldNotValid]:false,
[字段值]:evt.target.value,
});
}否则{
这个.setState({
[isFieldNotValid]:true,
[fieldValue]:“”,
});
}
}
其主要思想是,在条件为非真且值为空之前,状态不会更新不需要使用onKeyPress、Down等,
如果您使用这些方法,它们在触摸设备上也不起作用解决方案 今天,我发现使用
parseInt()
也是一种很好且干净的做法。下面是一个onChange(e)
示例
代码
解释
parseInt()
将返回NaN
parseInt('12a')
将返回12使用如下所示的
onChange()
方法定义一个输入(在我的例子中,childState包含传递给这个子组件的状态)
用户现在不允许在输入字段中键入除backspace、0-9或e(这是一个数字…)以外的任何内容
我引用了这篇文章来创建我的解决方案:我发现的最有效、最简单的解决方案:
/[\+\-\.\,]$/.test(e.key)和&e.preventDefault()
/>
2019回答晚了,但希望它能帮助别人
这将确保您不会在空文本字段上获得null
- Textfield值始终为0
- 退格时,将以0结束
- 当值为0并开始键入时,0将替换为实际数字
//当textfield为空时,这将确保值从不为null
常数最小值=0;
导出默认值(道具)=>{
常量[计数,更改计数]=使用状态(最小值);
函数验证(计数){
返回parseInt(计数)|最小值
}
函数handleChangeCount(计数){
更改计数(验证(计数))
}
返回(
提交表格
);
};
在输入字段上设置类:
$(".digitsOnly").on('keypress',function (event) {
var keynum
if(window.event) {// IE8 and earlier
keynum = event.keyCode;
} else if(event.which) { // IE9/Firefox/Chrome/Opera/Safari
keynum = event.which;
} else {
keynum = 0;
}
if(keynum === 8 || keynum === 0 || keynum === 9) {
return;
}
if(keynum < 46 || keynum > 57 || keynum === 47) {
event.preventDefault();
} // prevent all special characters except decimal point
}
$(".digitsOnly").on('paste drop',function (event) {
let temp=''
if(event.type==='drop') {
temp =$("#financialGoal").val()+event.originalEvent.dataTransfer.getData('text');
var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be drag and dropped
if (!regex.test(temp)) {
event.preventDefault();
return false;
}
} else if(event.type==='paste') {
temp=$("#financialGoal").val()+event.originalEvent.clipboardData.getData('Text')
var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be pasted
if (!regex.test(temp)) {
event.preventDefault();
return false;
}
}
}
在componentDidMount()中调用这些事件,以便在页面加载后立即应用该类。在阅读了所有答案后,我提出了这个解决方案,但没有一个真正适用于数字,只适用于复制和粘贴
解决方案:由于parseInt
有效而失败李>parseInt(“2a”)
复制粘贴失败,退格李>onKeyup解决方案:
- key.which解决方案:复制粘贴可能失败李>
- type=“number”解决方案:在长数字上失败,如
javascript<
onChange(e){ this.setState({[e.target.id]: parseInt(e.target.value) ? parseInt(e.target.value) : ''}) }
<input ... value={this.props.childState.volume} ... onChange={(e) => handleChangeInteger(e, {volume: e.target.value})} />
const handleChangeInteger = (e, obj_to_return) => { if (validator.isInt(e.target.value) || e.target.value == '') { this.props.childSetState(obj_to_return) } }
$(".digitsOnly").on('keypress',function (event) { var keynum if(window.event) {// IE8 and earlier keynum = event.keyCode; } else if(event.which) { // IE9/Firefox/Chrome/Opera/Safari keynum = event.which; } else { keynum = 0; } if(keynum === 8 || keynum === 0 || keynum === 9) { return; } if(keynum < 46 || keynum > 57 || keynum === 47) { event.preventDefault(); } // prevent all special characters except decimal point }
$(".digitsOnly").on('paste drop',function (event) { let temp='' if(event.type==='drop') { temp =$("#financialGoal").val()+event.originalEvent.dataTransfer.getData('text'); var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be drag and dropped if (!regex.test(temp)) { event.preventDefault(); return false; } } else if(event.type==='paste') { temp=$("#financialGoal").val()+event.originalEvent.clipboardData.getData('Text') var regex = new RegExp(/(^100(\.0{1,2})?$)|(^([1-9]([0-9])?|0)(\.[0-9]{1,2})?$)/g); //Allows only digits to be pasted if (!regex.test(temp)) { event.preventDefault(); return false; } } }
<input name="address.line1" value={values.address.line1} onChange={(event: any) => { if (isFinite(event.target.value)) { // UPDATE YOUR STATE (i am using formik) setFieldValue("address.line1", event.target.value); } }} />
<input className="input-Flied2" type="TEXT" name="userMobileNo" placeholder="Moble No" value={phonNumber} maxLength="10" onChange={handleChangeInput} required /> const handleChangeInput = (e) => { const re = /^[0-9\b]+$/; //rules if (e.target.value === "" || re.test(e.target.value)) { setPhoneNumber(e.target.value); }
const toNumber = (value: string | number) => { if (typeof value === 'number') return value return parseInt(value.replace(/[^\d]+/g, '')) } const formatPrice = (price: string | number) => { return new Intl.NumberFormat('es-PY').format(toNumber(price)) }
<input defaultValue={formatPrice(price)} onBlur={e => { const numberValue = toNumber(e.target.value) setPrice(numberValue) e.target.value = formatPrice(numberValue) }} type='tel' required />
<input onKeyPress={(event) => { if (!/[0-9]/.test(event.key)) { event.preventDefault(); } }} />
<input type="text" onKeyPress={onNumberOnlyChange}/> const onNumberOnlyChange = (event: any) => { const keyCode = event.keyCode || event.which; const keyValue = String.fromCharCode(keyCode); const isValid = new RegExp("[0-9]").test(keyValue); if (!isValid) { event.preventDefault(); return; } };
const handleChange2 = (e) => { if (isNaN(e.target.value)) { return; } const onlyNums = e.target.value.replace(/[^0-9]/g, ""); setFormData({ ...formData, [e.target.name]: onlyNums, }); }; const [formData, setFormData] = useState({ name: "", phone: "", email: "", address: "", }); <input value={phone} onChange={(e) => handleChange2(e)} placeholder="Phone" type="text" name="phone" required />