Ios 您键入的金额的正则表达式?

Ios 您键入的金额的正则表达式?,ios,regex,uitextfield,Ios,Regex,Uitextfield,我允许的金额格式是 xxxxxx -或 xxxxxx.xx 分数是可选的 整个零件最多可保留6位小数 小数部分最多2位小数 点定义了整体和部分 若第一个字符为零,那个么之后只允许有一个点 只允许一个点 如果第一个字符也是零,则不允许在小数点后第二个字符处使用零 对于amount regex字符串(独立于平台)有很多问题。 然而,问题是,所有这些参数都假设只有在完全键入金额字符串之后,它们才会用于验证金额字符串 但我需要的是一个正则表达式,它将作为您在键入时可以键入的内容的过滤器。这意味着,根

我允许的金额格式是

xxxxxx -或 xxxxxx.xx

  • 分数是可选的
  • 整个零件最多可保留6位小数
  • 小数部分最多2位小数
  • 点定义了整体和部分
  • 若第一个字符为零,那个么之后只允许有一个点
  • 只允许一个点
  • 如果第一个字符也是零,则不允许在小数点后第二个字符处使用零
对于amount regex字符串(独立于平台)有很多问题。 然而,问题是,所有这些参数都假设只有在完全键入金额字符串之后,它们才会用于验证金额字符串

但我需要的是一个正则表达式,它将作为您在键入时可以键入的内容的过滤器。这意味着,根据顶部的要求,您应该能够将其键入文本字段,并且验证逻辑应该报告键入的内容与正则表达式完全匹配

0 0
0.01

在“键入时检查”场景中,这里有一个相当直观的方法来执行此类验证:

^(?=\d*\.?\d*$)(?!0\d|\d{7}|\d+\.\d(0|\d\d))
第一部分中的积极前瞻与可接受的一般模式相匹配,第二部分中的消极前瞻强制执行您的规则

对于amount regex字符串(独立于平台)有很多问题。但是问题是,所有这些字符串都假设只有在完全键入amount字符串之后,它们才会用于验证amount字符串

由此我推断,创建一个满足需求的正则表达式并没有问题,唯一的问题是实现它

为了在键入时过滤不需要的输入,您需要在
UITextFieldDelegate
方法
textField(\utextfield:UITextField,shouldchangeCharactersinrange:NSRange,replacementString:string)->Bool中放置一些过滤逻辑

func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
let regex=“^(?=\\d*\.?\\d*$)(?!0\\d\\\\d{7}\\\d+\.\\d(0\\\\d\\d))”
guard var amountString=textField.text else{
返回错误
}
amountString+=字符串
如果amountString.range(of:regex,options:.regularExpression)==nil{
返回错误
}
返回真值
}
在类中继承
UITextFieldDelegate
,将
UITextField
的委托分配给
self
即可

哦,作为奖励,我试着在没有Regex的情况下做这件事。似乎很有效。除非你对Regex有什么不满,否则就去做第一件吧

func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
guard var amountString=textField.text else{
返回错误
}
amountString+=字符串
if!isNumber(amountString){
返回错误
}
如果(amountString.first==“0”){
如果amountString.count==2&&amountString!=“0。”{
返回错误
}
}
如果let indexOfDecimal=amountString.index(of:“.”){
让decimalString=String((String(amountString[(indexOfDecimal)…])).dropFirst()
if(decimalString.count>2 | | decimalString==“00”){
返回错误
}
}else if(amountString.count>6&&string!=“){
返回错误
}
返回真值
}
func isNumber(s:String)->Bool{
返回浮点数!=零
}

哦,我知道委托回调。但我很困惑您的代码如何工作(它是这样的)…当您执行amountString+=string时..如果是删除怎么办?我们仍在将空字符串添加到当前字符串中。为什么?amountString仅用于确保输入格式正确的逻辑。它实际上不会更改text字段中的实际文本。我们需要做的只是根据是否批准返回true或false输入的e,即如果可接受,则返回true,否则返回false。