在 Swift 中将分数从 UITextField 转换为小数

Converting fractions into decimals from UITextField in Swift

是否可以将输入到 UITextField 中的分数转换为小数?

到目前为止,这是我尝试过的方法。如果我在 UITextField 中输入 2/3,我会得到 2.0 作为我的答案。

    @IBOutlet weak var answer: UITextField!

    var sAnswer = (answer.text as NSString).doubleValue

    println(sAnswer)

如果我只使用它,我会得到 2/3 但它是一个字符串而不是 0.6666666666 的十进制答案...

    @IBOutlet weak var answer: UITextField!

    var sAnswer = answer.text as NSString

    println(sAnswer)

没有。文本将始终是一个字符串。但是你可以做的是,为你的 UITextField 做一个扩展,你在 / 处分割你的字符串并分开它。那你return双倍值。像那样:

extension UITextField {
    var xo: Double! {
        get {
            var value = self.text.componentsSeparatedByString("/")
            return (value[0] as NSString).doubleValue / (value[1] as NSString).doubleValue
        }
    }
}

然后你就这样使用它:

answer.doubleValue

您需要在方法或扩展中自行解析并计算分数。一种做法如下:

extension UITextField {

    var fraction: Float {
        var comps = text.componentsSeparatedByString("/")

        //Do some validation here so as to check the correct format of fraction text.

        var op1 = NSString(string: comps[0]).floatValue
        var op2 = NSString(string: comps[1]).floatValue

        return op1/op2
    }
}

更现代的Swift5 解决方案:

func parse(fractionString: String) -> Float? {
    guard fractionString.range(of: "^\d+\/\d+$", options: .regularExpression) != nil else { return nil }

    let components = fractionString.split(separator: "/")
    if let numerator = Float(components[0]),
        let denominator = Float(components[1]),
        denominator != 0 {

        return numerator / denominator
    }
    
    return nil
}

开头的正则表达式检查只是确保输入的字符串只是中间有一个“/”的数字。

SWIFT 5.3

var fraction: String = "1/3"

var new = fraction.components(separatedBy: "/")

打印(新)

["1", "3"]

从这一点你可以return除法结果。我提供这个答案是因为在 swift.

的较新版本中更改了“分隔符”符号

func convertStringToFraction(stringNumber: String) -> Float {

let stringFloat = stringNumber.components(separatedBy: "/")
let numerator = Float(stringFloat[0])!
let denominator = Float(stringFloat[1])!

return numerator / denominator

}