[swift]一个简单的stringToDouble的代码

来源:互联网 发布:淘宝好评兼职 编辑:程序博客网 时间:2024/05/17 08:09

闲来用swift写了一个String转换Double的小代码,跟大家分享。


看到网上有嫁接ObjC来完成StringToDouble的转换的,不过我看到有人反馈说如果string中包含了字母,返回值是0,而且如果是“8.88x”这种情况,仍然识别为可转换,转换的结果是8.88。不过由于我用他们的嫁接代码一直报错,没法编译,所以我也没有验证过上面说的两种情况。

我希望如果string包含了非Double字符时可以返回nil,而不是返回0或者8.88这种情况。

我写的代码返回值是Double?,如果测试发现不符合浮点型的格式,就返回nil。

好了,不多说,直接上代码:


import Foundation


extension String {

   func toDouble() ->Double? {

        //额外判断,如果是空String,返回0.0

       ifself == "" {

           return0.0

        }

        

        //首先,判断这个String是否是一个Float Point

        

        //1.判断它是否包含了数字正负以外的符号,如果包含其他符号则返回nil,否则继续

        //1.同时记录点的数量

        //1.同时记录正负号的数量

        //1.同时记录正负号的位置

       var pointCount =0//用来记录点的数量

       var positiveCount =0 //用来记录正号的数量

       var negativeCount =0 //用来记录负号的数量

       var signPos:Int?//用来记录正负号的位置

       for (pos, item)in enumerate(self) {

           switch item {

           caselet tempwhere String(temp).toInt() !=nil: break

           case"+": positiveCount++//记录正号的数量

            signPos = pos//记录正负号的位置

           case"-": negativeCount++//记录负号的数量

            signPos = pos//记录正负号的位置

           case".": pointCount++//记录的数量

            default:returnnil

            }

        }

        //2.然后判断有几个点,有2个或以上点就返回nil,否则继续

        //2.同时判断有一个正负号,超过一个就返回nil,否则继续

       if pointCount >1 {

           returnnil

        }

       if positiveCount + negativeCount >1 {

           returnnil

        }

        //3.正负号是否在开头,如果不在开头就返回nil,否则继续

       if signPos !=nil && (signPos!) !=0 {

           returnnil

        }

        

        

        //然后在确认为Float Point之后,开始进行转换

        

        //1.先记录正负性质,然后如果有正负号将正负号先从String中删除

       var str =self

        //先判断正负号,再删除符号

       let firstChar = str[str.startIndex]

       var signRecord:Bool

       switch firstChar {

       case"+":

            signRecord =true

           var tempIndex = str.startIndex

            tempIndex++

            str = str[tempIndex..<str.endIndex]

       case"-": signRecord =false

       var tempIndex = str.startIndex

        tempIndex++

        str = str[tempIndex..<str.endIndex]

       default: signRecord =true

        }

        

        //2.找到小数点的位置,分开整数部分和小数部分(如果有的话)

       var finalNum = Double()

       var pointIndex = find(str,".")

       ifvar pointIndexTemp = pointIndex {

           var整数部分 = String()

           forvar pos = str.startIndex; pos != pointIndexTemp; ++pos {

               整数部分 += String(str[pos])

            }

           var小数部分 = String()

            pointIndexTemp++

           forvar pos = pointIndexTemp; pos != str.endIndex; ++pos {

               小数部分 += String(str[pos])

            }

            //3.如果有整数部分,转换成整数

           if整数部分 != "" {

               iflet num =整数部分.toInt() {

                    finalNum += Double(num)

                }

            }

            //4.如果有小数部分,转换成小数

           if小数部分 != "" {

               iflet num =小数部分.toInt() {

                    finalNum += (Double(num) / pow(Double(10), Double(countElements(小数部分))))

                }

            }

        }else {

           iflet num = str.toInt() {

                finalNum = Double(num)

            }

        }

        //5.加上正负号

       if !signRecord {

            finalNum = -finalNum

        }

        

        //6.最后返回

       return finalNum

    }

}

0 0
原创粉丝点击