我需要将一个10位字符串格式化为以下格式:'(123)456- 7890'。但是,我需要在用户键入时发生这种情况。因此,如果用户仅输入了3个数字,则输入应显示:“(123)”。如果他们输入了5位数字,则输入应显示:(一二三)四十五
用我目前的代码,格式化只发生在输入第10个字符后。我希望它从第三个字符开始格式化。
const phoneRegex = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/
const handleInput = (value) => {
return (
value.replace(phoneRegex, '($1) $2-$3')
)
}
class FindASubscriber extends React.Component {
constructor(props) {
super(props)
this.state = {
value: ''
}
}
render() {
const { label, placeholder, feedback } = this.props
const { value} = this.state
return (
<div className="find__a__subscriber">
<FlexGrid>
<FlexGrid.Col>
<FlexGrid.Row>
<Input
feedback={feedback}
label={label}
type="text"
pattern="[0-9]*"
placeholder={placeholder}
value={handleInput(value)}
maxLength="10"
onChange={
(event) => this.setState({value: event.target.value})
}
/>
</FlexGrid.Row>
</FlexGrid.Col>
</FlexGrid>
</div>
)
}
}```
6条答案
按热度按时间r7knjye21#
你可以像这样
normalize
input
value
相对于event.target.value
是最新的previousValue
是已验证并设置为state
的值这是以防止无效字符更新输入的方式构造的,并且还将输入限制为10个数字。
Run code snippet
按钮查看工作示例。**x一个一个一个一个x一个一个二个一个x一个一个三个一个
或者...有3个单独的输入,并在完成后将它们组合在一起。
798qvoo82#
关键在于格式。任何打印字符的键
应该会导致输入字段的重写。
这样,无论用户做什么,他都只能看到有效的格式化字段。
正则表达式是简单的
^\D*(\d{0,3})\D*(\d{0,3})\D*(\d{0,4})
你甚至可以更好的显示下划线
应该是在任何给定的时间。
喜欢
(___) ___ - ____
(20_) ___ - ____
(123) 456 - ____
等等......(如果你想要这个,让我知道)
cs7cruho3#
当前代码的正则表达式仅在输入10位数字(3、3、4)时匹配。您可以更新正则表达式以接受一定范围的数字,例如:
或者,您可以让正则表达式确保输入了0-10个数字([0-9]{0,10}),然后自己将字符串拆分为长度为3、3和4的子字符串。后一种方法似乎更好,因为您只想根据用户输入的数字显示某些字符:
1 -〉(1
123 -〉(123)
1234567 -〉(123)456-7
电话:1234567890 -〉(123)456-7890
您必须处理这些情况中的每一种,而简单的替换无法做到这一点。
xxhby3vn4#
我使用过这个库:https://www.npmjs.com/package/libphonenumber-js它有一个AsYouType函数,您可以在输入中使用它
au9on6nz5#
也许,下面的一些东西会对某人起作用:
xoshrz7s6#
使用这个包https://www.npmjs.com/package/react-number-formatter,这个输入组件格式化数字并只返回数字。