美文网首页程序员首页投稿(暂停使用,暂停投稿)Tech
记录仿iPhone计算器Dome精度控制、上限控制和Swift2

记录仿iPhone计算器Dome精度控制、上限控制和Swift2

作者: devRen | 来源:发表于2015-11-08 08:15 被阅读849次

    前段时间仿iPhone计算机写的Dome如图(已经完成Auto Layout),现在来记录一些细节上的优化。
    先感谢Prayer等团队翻译的The Swift Programming Language( 中文版): http://wiki.jikexueyuan.com/project/swift/chapter2/03_Strings_and_Characters.html在该文档中找到了Dome中使用String的所有用法。
    项目dome已经上传GitHub:
    ***https://github.com/BigTortoise/CalculatorLikeApple ***

    4.0 4.7 5.5寸屏的适配.png

    精度控制

    在Dome中设置成保留10位有效数字,并使用四舍五入的保留有效数位。


    精度控制演示.gif
            //声明一个常量count记录运算结果字符的长度
            let count = display.text!.characters.count
            if count >= 11 {
                //截取前11位字符
                let OneToTen = (display.text! as NSString).substringToIndex(11)
                //截取前9位字符
                let OneToN = (display.text! as NSString).substringToIndex(9)
                //提取前11位字符中第11位字符,也就是最后一位
                let end11 = (OneToTen as NSString).substringFromIndex(10)
                //提取前10位字符中第10和11位字符
                var end10 = (OneToTen as NSString).substringFromIndex(9)
                //如果第11位数字大于5,那么就要向前进位,也就是第10位+1
                if Int(end11) >= 5 {
                    end10 = String(Int(end10)! + 1)
                    display.text = OneToN + end10
                }   
            }
    

    上限控制

    仿造iPhone的效果,我设置用户能输入的位数上限位10个有效数位,运算后若数位超过10位有效数字,则用科学计数法表示,如图进行运算时,1234567890*10,得出的结果为:1.23456789e11


    上限控制演示.gif

        // 创建operandStack数组,记录运算的两个数子
        var operandStack = Array<Double>()
        // 记录第几次输入数字
        var userIsInTheMiddleOfTypingANumber : Bool = false
    
    //运算方法,结果再次存入operandStack数组
        func performOperation(operation : (Double,Double) -> Double ) {
            if operandStack.count >= 2{
                displayValue = operation(operandStack.removeLast(),operandStack.removeLast())
                userIsInTheMiddleOfTypingANumber = false
                operandStack.append(displayValue)
            }
      }
    
    // = 按钮的进行运算,调用performOperation的方法
        @IBAction func equals(sender: UIButton) {
            if userIsInTheMiddleOfTypingANumber {
                userIsInTheMiddleOfTypingANumber = false
                operandStack.append(displayValue)
            }
            let counts = display.text!.characters.count
            if counts >= 10 {
                //display.text = (display.text! as NSString).substringToIndex(10)
                if userIsInTheMiddleOfTypingANumber {
                    userIsInTheMiddleOfTypingANumber = false
                    operandStack.append(displayValue)
                }
                switch remberTheMathematicalSign {
                case "×" : performOperation {$0 * $1}
                case "÷" : performOperation {$1 / $0}
                case "+" : performOperation {$0 + $1}
                case "−" : performOperation {$1 - $0}
                default:break
                }
                TheTimeUserClickButton = ++TheTimeUserClickButton
    
                
            }else{
                switch remberTheMathematicalSign {
                case "×" : performOperation {$0 * $1}
                case "÷" : performOperation {$1 / $0}
                case "+" : performOperation {$0 + $1}
                case "−" : performOperation {$1 - $0}
                default:break
                }
                TheTimeUserClickButton = ++TheTimeUserClickButton
            }      
            //声明一个常量count记录运算结果字符的长度
            let count1 = display.text!.characters.count
            var theNumberOfZero = 1
            //计算出位数
            for var i = 6; i < count1; ++i {
                theNumberOfZero *= 10
            }
            //截取前八位字符
            let OneToTen = (display.text! as NSString).substringToIndex(8)
            //进行运算
            let x = Double(OneToTen)! / Double(theNumberOfZero)
            //再次进行截取
            let Y = (String(x) as NSString).substringToIndex(8)
            //字符串拼接
            display.text = String(Y) + "e\(count1-2)"
    

    Dome中String的一些用法

    • 声明一个常量count记录运算结果字符的长度
    let count1 = display.text!.characters.count
    
    • 截取前11位字符
    let OneToTen = (display.text! as NSString).substringToIndex(11)
    
    • 提取11位字符串中第11位字符,也就是最后一位
    let end11 = (OneToTen as NSString).substringFromIndex(10)
    
    • 字符串拼接
    display.text = String(Y) + "e\(count1-2)"
    

    其他String的一些用法

    • 字符串插值
    let multiplier = 3
    let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
    // message is "3 times 2.5 is 7.5"
    
    • 计算字符数量
    let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
    print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
    // 打印输出 "unusualMenagerie has 40 characters"
    
    • 插入和删除
      • 调用insert(_:atIndex:)方法可以在一个字符串的指定索引插入一个字符。
    var welcome = "hello"
    welcome.insert("!", atIndex: welcome.endIndex)
    // welcome now 现在等于 "hello!"
    
    • 调用insertContentsOf(_:at:)方法可以在一个字符串的指定索引插入一个字符串。
    welcome.insertContentsOf(" there".characters, at: welcome.endIndex.predecessor())
    // welcome 现在等于 "hello there!"
    
    • 调用removeAtIndex(_:)方法可以在一个字符串的指定索引删除一个字符。
    welcome.removeAtIndex(welcome.endIndex.predecessor())
    // welcome 现在等于 "hello there"
    
    • 调用removeRange(_:)方法可以在一个字符串的指定索引删除一个子字符串。
    let range = welcome.endIndex.advancedBy(-6)..<welcome.endIndex
    welcome.removeRange(range)
    // welcome 现在等于 "hello"
    

    相关文章

      网友评论

        本文标题:记录仿iPhone计算器Dome精度控制、上限控制和Swift2

        本文链接:https://www.haomeiwen.com/subject/aaichttx.html