String 在Swift中将字符串转换为浮点
我试着把取自UITextField的数字转换成字符串,然后把它们转换成Float,这样我就可以把它们相乘 我有两个String 在Swift中将字符串转换为浮点,string,floating-point,swift,string-parsing,String,Floating Point,Swift,String Parsing,我试着把取自UITextField的数字转换成字符串,然后把它们转换成Float,这样我就可以把它们相乘 我有两个UITextfields,声明如下: @IBOutlet var wage: UITextField @IBOutlet var hour: UITextField 当用户按下UIButton时,我想计算用户的工资,但我不能,因为我需要先将它们转换为浮动,然后才能使用它们 我知道如何通过以下操作将它们转换为整数: var wageConversion:Int = 0 wageCon
UITextfield
s,声明如下:
@IBOutlet var wage: UITextField
@IBOutlet var hour: UITextField
当用户按下UIButton时,我想计算用户的工资,但我不能,因为我需要先将它们转换为浮动,然后才能使用它们
我知道如何通过以下操作将它们转换为整数:
var wageConversion:Int = 0
wageConversion = wage.text.toInt()!
但是,我不知道如何将它们转换为浮点。Double()
var convertedDouble=Double(someInt)
请注意,这仅在文本实际包含数字时才起作用。由于Wage
是一个文本字段,用户可以输入他们想要的任何内容,当您去取消绑定从toInt()
返回的可选项时,这将触发运行时错误。在强制取消装箱之前,应检查转换是否成功
if let wageInt = Wage.text?.toInt() {
//we made it in the if so the conversion succeeded.
var wageConversionDouble = Double(wageInt)
}
编辑:
如果您确定文本将是一个整数,则可以执行如下操作(注意,UITextField上的text
on也是可选的):
Swift 2.0+
现在使用Swift 2.0您可以使用Float(Wage.text)
返回Float?
类型。比下面只返回0
的解决方案更清晰
如果出于某种原因,您希望为无效的Float
设置0
值,您可以使用Float(Wage.text)??0
如果它不是有效的浮点
,将返回0
老办法
处理此问题的最佳方法是直接浇铸:
var WageConversion = (Wage.text as NSString).floatValue
实际上,我创建了一个扩展
,以便更好地使用它:
extension String {
var floatValue: Float {
return (self as NSString).floatValue
}
}
现在,您只需调用var WageConversion=Wage.text.floatValue
,并允许扩展为您处理桥接
这是一个很好的实现,因为它可以处理实际的浮动(使用
输入),并有助于防止用户将文本复制到输入字段(12p.34
,甚至12.12.41
)
显然,如果苹果真的在Swift中添加了一个floatValue
,这将抛出一个异常,但同时它可能会很好。如果他们以后添加了它,那么修改代码所需要做的就是删除扩展名,一切都将无缝工作,因为您已经在调用.floatValue
此外,变量和常量应以小写开头(包括IBOutlets
)简易方式:
// toInt returns optional that's why we used a:Int?
let a:Int? = firstText.text.toInt()
let b:Int? = secondText.text.toInt()
// check a and b before unwrapping using !
if a && b {
var ans = a! + b!
answerLabel.text = "Answer is \(ans)"
} else {
answerLabel.text = "Input values are not numberic"
}
您可以使用相同的方法进行其他计算,希望对您有所帮助 使用以下命令:
// get the values from text boxes
let a:Double = firstText.text.bridgeToObjectiveC().doubleValue
let b:Double = secondText.text.bridgeToObjectiveC().doubleValue
// we checking against 0.0, because above function return 0.0 if it gets failed to convert
if (a != 0.0) && (b != 0.0) {
var ans = a + b
answerLabel.text = "Answer is \(ans)"
} else {
answerLabel.text = "Input values are not numberic"
}
您有两个非常相似的选项(根据方法和结果):
因为在世界上的一些地方,例如,用逗号代替十进制。最好创建一个NSNumberFormatter,将字符串转换为float
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(self.stringByTrimmingCharactersInSet(Wage.text))
我就是这样做的。我不想“过桥”,因为它已经从Xcode 6 beta 5中删除了,而且速度快而且脏:
extension String {
// converting a string to double
func toDouble() -> Double? {
// split the string into components
var comps = self.componentsSeparatedByString(".")
// we have nothing
if comps.count == 0 {
return nil
}
// if there is more than one decimal
else if comps.count > 2 {
return nil
}
else if comps[0] == "" || comps[1] == "" {
return nil
}
// grab the whole portion
var whole = 0.0
// ensure we have a number for the whole
if let w = comps[0].toInt() {
whole = Double(w)
}
else {
return nil
}
// we only got the whole
if comps.count == 1 {
return whole
}
// grab the fractional
var fractional = 0.0
// ensure we have a number for the fractional
if let f = comps[1].toInt() {
// use number of digits to get the power
var toThePower = Double(countElements(comps[1]))
// compute the fractional portion
fractional = Double(f) / pow(10.0, toThePower)
}
else {
return nil
}
// return the result
return whole + fractional
}
// converting a string to float
func toFloat() -> Float? {
if let val = self.toDouble() {
return Float(val)
}
else {
return nil
}
}
}
// test it out
var str = "78.001"
if let val = str.toFloat() {
println("Str in float: \(val)")
}
else {
println("Unable to convert Str to float")
}
// now in double
if let val = str.toDouble() {
println("Str in double: \(val)")
}
else {
println("Unable to convert Str to double")
}
我通过以下方式将字符串转换为浮点:
let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue
println("number is \(numberFloatValue)") // prints "number is 15.5"
let wage:Float = Float(textField.text!)!
使用公认的解决方案,我发现我的“1.1”(使用.floatValue转换时)将转换为1.10000002384186,这不是我想要的。但是,如果我改用.doubleValue,我会得到我想要的1.1
例如,我没有使用公认的解决方案,而是使用了:
var WageConversion = (Wage.text as NSString).doubleValue
在我的例子中,我不需要双重精度,但使用.floatValue并没有给出正确的结果
只是想在讨论中添加此内容,以防其他人遇到同样的问题。更新
公认的答案显示了一种更为现代的做法
Swift 1
保罗·赫加蒂(Paul Hegarty)在2015年斯坦福CS193p课程上的表现如下:
wageConversion = NSNumberFormatter().numberFromString(wage.text!)!.floatValue
您甚至可以创建一个计算属性,而不必每次都这样做
var wageValue: Float {
get {
return NSNumberFormatter().numberFromString(wage.text!)!.floatValue
}
set {
wage.text = "\(newValue)"
}
}
下面将给你一个可选的浮动,坚持一个!最后,如果您知道它是一个Float,或者使用if/let
let wageConversion = Float(wage.text)
以下是根据rdprado的答案对Paul Hegarty的解决方案进行的Swift 3改编,其中添加了一些选项检查(如果流程的任何部分失败,则返回0.0):
顺便说一句,我用iTunes大学参加了斯坦福大学的CS193p课程,当时它还在教Objective-C
我发现Paul Hegarty是一位非常棒的讲师,我会向任何一位在Swift开始作为iOS开发者的人强烈推荐这门课 > P>为了完整性,这是一个使用<>代码> UITExtField>代码>的解决方案,它也可以考虑不同的区域。
斯威夫特3+
extension UITextField {
func floatValue(locale : Locale = Locale.current) -> Float {
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.locale = locale
let nsNumber = numberFormatter.number(from: text!)
return nsNumber == nil ? 0.0 : nsNumber!.floatValue
}
}
我找到了另一种方法来获取UITextField的输入值并将其转换为float:
var tempString:String?
var myFloat:Float?
@IBAction func ButtonWasClicked(_ sender: Any) {
tempString = myUITextField.text
myFloat = Float(tempString!)!
}
斯威夫特4
let Totalname = "10.0" //Now it is in string
let floatVal = (Totalname as NSString).floatValue //Now converted to float
Swift 4/5,仅使用浮动(值)
回答:123200您可以使用
let wg = Float(wage.text!)
如果要将浮点值四舍五入到小数点后2位:
let wg = Float(String(format: "%.2f",wage.text!)
//此外,你还可以保护你的价值观,以便在你的应用程序崩溃时检查发生了什么
guard let myFloat = temp.floatValue else {
fatalError(" fail to change string to float value.")
}
在Xcode 11中将字符串转换为浮点
因为以前的方法需要修改
func stringToFloat(value : String) -> Float {
let numberFormatter = NumberFormatter()
let number = numberFormatter.number(from: value)
let numberFloatValue = number?.floatValue
return numberFloatValue!
}
我通过以下方式将字符串转换为浮点:
let numberFormatter = NSNumberFormatter()
let number = numberFormatter.numberFromString("15.5")
let numberFloatValue = number.floatValue
println("number is \(numberFloatValue)") // prints "number is 15.5"
let wage:Float = Float(textField.text!)!
嗯,我只允许用户输入数字,因为键盘是十进制键盘,所以他们实际上只能输入数字。wageConversionFloat
永远不会是浮点数,如果输入字符串是类似于234.56
的浮点数,它会直接崩溃。这怎么可能是一个被接受/投票表决的解决方案…?如果文本包含十进制值,则此答案不起作用。示例-如果文本字段具有3.5
,则此答案将返回3
。这是因为文本首先转换为Int
,然后Int
转换为Float
@StephenFox请记住,用户可以将非数字文本粘贴到文本字段中,或者用户可能有一个外部键盘。永远不要仅仅依靠键盘来确保数据输入。事实上,对于整数,它确实有效
let wg = Float(String(format: "%.2f",wage.text!)
Works on Swift 5+
import Foundation
let myString:String = "50"
let temp = myString as NSString
let myFloat = temp.floatValue
print(myFloat) //50.0
print(type(of: myFloat)) // Float
guard let myFloat = temp.floatValue else {
fatalError(" fail to change string to float value.")
}
func stringToFloat(value : String) -> Float {
let numberFormatter = NumberFormatter()
let number = numberFormatter.number(from: value)
let numberFloatValue = number?.floatValue
return numberFloatValue!
}
let wage:Float = Float(textField.text!)!