Вы можете использовать
const rx_live = /^[+-]?\d*(?:[.,]\d*)?$/;
для проверки в реальном времени. Для окончательной проверки используйте
const rx_final = /^[+-]?\d+(?:[.,]\d+)?$/;
Или, что лучше, просто используйте регулярное выражение в атрибуте pattern
: pattern="[+-]?\d*(?:[.,]\d*)?"
.
NOTE
^
- начало строки [+-]?
- необязательно +
или -
\d*
- 0 или более цифр (?:[.,]\d*)?
- необязательная последовательность .
или ,
, а затем 0 или более цифр $
- конец строки.
В окончательной проверке,\d+
используется вместо \d*
для сопоставления одной или нескольких цифр, а не нуля или более цифр.
См. Демонстрационную версию JS:
const rx_live = /^[+-]?\d*(?:[.,]\d*)?$/;
class TestForm extends React.Component {
constructor() {
super();
this.state = {
depositedAmount: ''
};
}
handleDepositeAmountChange = (evt) => {
if (rx_live.test(evt.target.value))
this.setState({ depositedAmount : evt.target.value });
}
render() {
return (
<form>
<input
type="text"
id="depositedAmount"
maxLength={9}
pattern="[+-]?\d+(?:[.,]\d+)?"
placeholder="Enter amount"
onChange={this.handleDepositeAmountChange}
value={this.state.depositedAmount}
/>
</form>
)
}
}
ReactDOM.render( < TestForm /> , document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>