首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将UITextField限制为小数点Swift

将UITextField限制为小数点Swift
EN

Stack Overflow用户
提问于 2014-08-10 05:41:07
回答 10查看 5.5K关注 0票数 3

如何使用Swift将UITextField限制在小数点以内?文本字段用于输入价格,因此我不能允许超过一个小数点。如果我使用的是Objective,我会使用以下代码:

代码语言:javascript
运行
复制
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSArray *sep = [newString componentsSeparatedByString:@"."];
    if([sep count] >= 2)
    {
        NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
        return !([sepStr length]>1);
    }
    return YES;
}

但是由于Swift使用范围的不同,我无法将此代码转换为Swift。第一行给出了一个错误:NSRange is not convertible to Range<String.Index>

编辑:,在我看到答案之前,我就这样做了:

代码语言:javascript
运行
复制
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
    let tempRange = textField.text.rangeOfString(".", options: NSStringCompareOptions.LiteralSearch, range: nil, locale: nil)
    if tempRange?.isEmpty == false && string == "." {
        return false
    }

    return true
}

我在另一个岗位上发现了这个。这个解决方案很好,但我不确定它是否是最好的方法,但它是一个简短和干净的方式。

EN

回答 10

Stack Overflow用户

发布于 2018-01-09 17:56:44

Swift 4& Xcode 9.2

此解决方案只允许输入一个小数点,因此允许使用有效的双小数点。

代码语言:javascript
运行
复制
// Only allows one decimal point
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    let arrayOfString = newString.components(separatedBy: ".")

    if arrayOfString.count > 2 {
        return false
    }
    return true
}
票数 5
EN

Stack Overflow用户

发布于 2014-08-10 08:45:19

Alexey在我之前就到了,但是看到我已经实现了一个Swift版本来检查事情,下面是:

代码语言:javascript
运行
复制
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {

    // I'm explicitly unwrapping newString here, as I want to use reverse() on it, and that
    // apparently doesn't work with implicitly unwrapped Strings.
    if let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string) {

        var decimalFound = false
        var charactersAfterDecimal = 0

        for ch in reverse(newString) {
            if ch == "." {
                decimalFound = true
                break
            }
            charactersAfterDecimal++
        }
        if decimalFound && charactersAfterDecimal > 1 {
            return false
        }
    }
    return true;
}

注意,第一行现在显式地将textField.text转换为NSString。这是因为stringByReplacingCharactersInRange的字符串版本采用了Swift范围,而不是像传入的那样的NSRange。

我还使后面的代码更加Swiftian,删除了NSString操作。(我不认为这是非常有效的,因为反向( String )实际上可能逆转整个字符串,而不是提供一个简单的反向迭代器,但它看起来是最快速的方法。)

票数 4
EN

Stack Overflow用户

发布于 2014-08-10 08:30:18

您在Swift中的第一行如下:

代码语言:javascript
运行
复制
var newString = NSString(string: textField.text).stringByReplacingCharactersInRange(range, withString: string)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25225904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档