使用 Swift 如何将字符串转换为数字

Using Swift how to convert a string to a number

我从 Web 服务中获取返回值,该服务以字符串格式返回价格,它被放入字典中,因此我返回的价格为“1.5000”,例如,这显然是 1.50 的货币。然而,对于我的生活,我无法在 Swift 中进行任何工作以正确格式化它。在大多数其他语言中,您可以在几秒钟内完成此操作,所以我对如此简单的事情感到有点沮丧。

这是我的测试代码:

    var testnumber = "1.5000"
    let n = NSNumberFormatter()
    n.numberStyle = NSNumberFormatterStyle.DecimalStyle
    n.maximumFractionDigits = 2
    n.minimumFractionDigits = 2
    let returnNumber = n.numberFromString(testnumber)
    println("Returned number is \(returnNumber)")

这在调试中打印出来 "number is Optional(1.5)" 而不是 1.50!

我已将 NSNumberFormatterStyle.DecimalStyle 更改为 NSNumberFormatterStyle.CurrencyStyle,因为我认为这可能对我有用,因为返回的数字无论如何都是一种货币,但这让我回到了调试状态 "Returned number is nil" -这让我更加困惑!

我尝试过使用 maximumIntegerDigits 和 minimumIntegerDigits,使用 n.locale = NSLocale.currentLocale() 设置语言环境,设置 formatWidth,设置 paddingPosition 和 paddingCharacter 但没有任何帮助,我要么将 nil 返回到 1.5。

我最终需要做的就是将字符串转换为浮点数或货币值,并确保有 2 位小数,我不敢相信这很难完成!

如有任何帮助,我们将不胜感激。

您打印的是数字而不是字符串

Xcode 11.4 • Swift 5.2 或更高版本

extension Formatter {
    static let usCurrency: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.locale = .init(identifier: "en_US")
        formatter.numberStyle = .currency
        return formatter
    }()
}

extension String {
    var double: Double? { Double(self) }
    var usCurrencyFormatted: String {
        Formatter.usCurrency.string(for: double) ?? Formatter.usCurrency.string(for: 0) ?? ""
    }
}

"1.1222".usCurrencyFormatted           // ".12"
"2".usCurrencyFormatted                // ".00"

问题是关于 numberFromString 返回一个可选的 - 所以你必须在打印前打开包装。为了安全起见,您可以使用可选绑定:

if let returnNumber = n.numberFromString(testnumber) {
    println("Returned number is \(returnNumber)")
}

否则如果可选项为 nil 时应用程序崩溃是正常的(在某些情况下,如果期望可选项始终包含非 nil 值,这是一种想要的行为),只需使用强制解包:

let returnNumber = n.numberFromString(testnumber)!
println("Returned number is \(returnNumber)")

这修复了不需要的 "Optional(xx)" 文本。至于格式化 float/double 数字,可能有几种方法 - 我会使用的一种是类似 c 的字符串格式化,可通过 NSString:

let formattedNumber = NSString(format: "%.2f", returnNumber)
println("Returned number is \(formattedNumber)")

如果您想了解有关格式说明符的更多信息,请使用 String Format Specifiers 作为参考。

您可能只使用刚刚创建的 NSNumberFormatter

let returnNumber = n.stringFromNumber(n.numberFromString(testnumber))

returnNumber 现在的类型是 String.

以下returns我在游乐场小数点后2位。可能对你有一些帮助。使用 NSNumberFormatter 然后打开可选的

let testnumber: String = "1.50000"
let numberFormatter = NSNumberFormatter()
let number  = numberFormatter.numberFromString(testnumber)
if let final = number?.floatValue {
    println("Returned number is " + String(format: "%.2f", final))
}