记录仿iPhone计算器Dome精度控制、上限控制和Swift2.0中String的用法

前段时间仿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"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • 1 .字符串字面量 String 在Swift中字符串字面量是由双引号" " 包裹着的 像我们在 Swift 3 ...
    iceMaple阅读 1,112评论 1 2
  • 53.计算字符 在字符串中获取字符值的数量, 可以使用字符串字符属性中的计数属性: let unusualMena...
    无沣阅读 1,049评论 0 4
  • // // main.swift // Swift // // Created by 空想家 on 16/7/1....
    wk空想家阅读 383评论 0 0
  • 一说起坚持也许大家都会头疼,因为曾经的你可能有太多太多没能坚持下去的事了。 你曾经说过要健身,说过要读书,说过要写...
    高丁一阅读 274评论 9 3
  • 曦(mei&mei) 面朝大海,等待花开。 自从读过海子的“面朝大海,春暖花开”,我的内心便萌生了一个大海梦。我也...
    曦MEI阅读 310评论 0 2