【问题标题】:How to read a specific format ( XXX.X ) from UItextfield in swift?如何快速从 UItextfield 读取特定格式( XXX.X )?
【发布时间】:2017-12-02 04:12:02
【问题描述】:

我想以 XXX.X 格式快速从文本字段中读取文本。假设我的意思是 XXX.X 格式:

  • 123.3 有效
  • 48.2 有效
  • 1.4 有效
  • 4 有效
  • 4.3.4 无效
  • 5555.5 无效
  • 123.34 无效

换句话说,句点左侧的文本最多只能有3个字符,如果用户没有输入“.”,则左侧的文本只能有1个字符或根本没有字符

目前,我的代码仅适用于限制“。”的数量

func textField(textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool
{
    let countdots = textField.text.components(separatedBy: ".").count)! - 1

    if countdots > 0 && string == "."
    {
        return false
    }
    return true
}

【问题讨论】:

  • 这是一个浮点数吗?如果是这样,那么使用逗号或其他字符而不是句点作为小数点分隔符的语言环境呢?
  • 使用正则表达式
  • @rmaddy 是的,它是一个浮点数。事实上,我可以使用逗号或其他字符作为分隔符,但这不是我的问题。这里的问题是如何限制“。”右侧的字符数。 (或您提到的其他字符)和左侧的字符数。
  • return true 替换为countdots.first.count <= 3 就完成了

标签: ios swift uitextfield textfield


【解决方案1】:
func valid(_ s:String) -> Bool {
    func roundToPlaces(value:Double, places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return round(value * divisor) / divisor
    }
    if let num = Double(s) {
        if num >= 1000.0 {
            return false
        }
        if roundToPlaces(value:num, places:1) != num {
            return false
        }
        return true
    } else {
        return false
    }
}

测试您的输入:

let test = [
    "123.3",
    "48.2",
    "1.4",
    "4",
    "4.3.4",
    "5555.5",
    "123.34"
]

for s in test {
    print(valid(s))
}

结果:

true
true
true
true
false
false
false

这就是你的输入和你想要的输出。

【讨论】:

  • 太棒了!我已经解决了一整天了,你刚刚为我解决了。非常感谢!
  • 它确实涵盖了您提供的具体示例,但您可能需要针对您未提及的其他示例进行更改...
【解决方案2】:

试试这样的(正则表达式可能是错误的,你需要自己修复它)

-(BOOL)isValidValue:(NSString *)checkString{
    NSString *stricterFilterString = @"^[0-9]{1,3}[.][0-9]{1}";
    NSPredicate *valueTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stricterFilterString];
    return [valueTest evaluateWithObject:checkString];
}

测试:

NSLog(@"%@", [self isValidValue:@"123.3"] ? @"YES" : @"NO");

[更新]

对于 Swift 3

func valueCheck(_ checkString: String) -> Bool {   
    var result = false
    do {
        let regex = try RegularExpression(pattern: "^[0-9]{1,3}[.][0-9]{1}", options: [])
        let results = regex.matches(in: checkString, options: [], range: NSMakeRange(0, checkString.characters.count))
        if results.count > 0 {
            return true
        } else {
           return false
        }
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
    }
    return false
}

【讨论】:

  • 这不处理本地化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多