[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
}
}
- [swift]一个简单的stringToDouble的代码
- StringToDouble()
- 用Swift实现一个简单的浏览器
- swift做一个简单的计算器
- Swift 写一个简单的浏览器
- 一个简单的聊天代码
- 一个简单的PYTHON代码
- 一个简单的翻页代码
- 一个简单的PYTHON代码
- 一个如此简单的代码
- 一个简单的AJAX代码
- swift的代码教程-ios简单动画类(Animator)
- swift的代码教程-ios简单声音类(SoundOp)
- swift的代码教程-ios简单动画类(Animator)
- swift的代码教程-ios简单声音类(SoundOp)
- swift简单的赋值
- swift的简单了解
- Swift--简单的定时器
- vs code整段右移或者左移
- 关于java.lang.NoClassDefFoundError(更新)(Could not find or load main class)
- 字符串反转输出
- Android Audio系统之RingerMode
- JAVA 目录深度遍历 练习
- [swift]一个简单的stringToDouble的代码
- DM36X UBL UBoot
- express4.2中自己的app.js配置
- Android MediaScanner:(一)MediaScanner总体架构
- Java反射 (一些总结性知识,可能不全面)
- 第一章《数据结构》的思维导图
- 网络编程学习笔记(批量输入)
- Annotation 使用笔记(一)
- java 幂等性