【问题标题】:Swift String to Int Always Returns nilSwift String 到 Int 总是返回 nil
【发布时间】:2019-05-31 06:22:29
【问题描述】:

我正在尝试将 String 转换为 Int。看起来很简单,但出于某种原因,它总是返回nil

我只是在编写一个简单的扩展来将美元转换为美分:

func dollarsToCents() -> Int {
    var temp = self;
    temp = temp.replacingOccurrences(of: "$", with: "")
    temp = temp.replacingOccurrences(of: ",", with: "")

    if let number = Int(temp) {
        return number*100
    }

    return 0
}

我将temp 设置为“$250.89”。 number 始终为零。无论我如何将temp 转换为 Int,它总是为零。有谁知道我做错了什么?

【问题讨论】:

  • 使用NumberFormatter,不要手动解析货币格式的字符串。
  • 我更新了我的问题。不知道它对你有什么作用,而不是我。
  • @tentmaking 很可能他们使用整数字符串而不是十进制字符串进行测试。

标签: swift string int


【解决方案1】:

问题是,字符串"250.89"(删除货币符号后)无法转换为Int,因为250.89 不是整数。所以修复你的代码,把它转换成Double

func dollarsToCents() -> Int {
    var temp = self
    temp.removeAll { "$,".contains($0) }
    //temp = temp.replacingOccurrences(of: "[$,]", with: "", options: .regularExpression)
    return Int(((Double(temp) ?? 0) * 100).rounded())
}

或者如果你的“数字”总是有两位小数

func dollarsToCents() -> Int {
    var temp = self
    temp.removeAll { !("0"..."9" ~= $0) }
    return Int(temp) ?? 0
}

但我认为解决方案要容易得多。您的目标应该是将 price 值保存为数字 (Double,...)。然后您不必将String 转换为Double,您只需将您的数字相乘即可。然后当您需要添加货币符号时,只需将您的值转换为String 并添加$ 或使用NumberFormatter

let price = 250.89
let formattedPrice = "$\(price)" // $250.89

let price = 250.89
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencyCode = "USD"
let formattedPrice = formatter.string(from: price as NSNumber)! // $250.89

【讨论】:

  • NumberFormatter 是要走的路。除了更容易之外,它更灵活,如果您需要考虑其他语言环境,可以进行调整(例如,在十进制表示中句点和逗号颠倒的某些欧洲国家 - 即 123.456,78 而不是 123,456.78) .
  • @CharlesSrstka 这不仅与货币符号有关,还与头寸有关。英语是少数在金额前显示货币符号的语言之一。在我的语言中,这将被格式化为"250,89 USD"。在格式化更加棘手的情况下,也可能出现负数。我们不知道实际的用例。
  • @RobertDresler 请注意,您不必从字符串中删除任何字符,也可以使用 NumberFormatter 对其进行解析。 let price = "$250.89"let formatter = NumberFormatter()formatter.numberStyle = .currencylet number = formatter.number(from: price)! // 250.89
  • @LeoDabus 是的,需要明确的是,NumberFormatter 应该在货币字符串需要转换为数字时使用,反之亦然。但是,我也同意回答者的观点,即最好将价格存储为 Double 而不是 String 首先,在这种情况下将 String 转换为 Double 变得不必要。
  • @LeoDabus 哦,我明白了,它也只是删除了.,所以你不必再乘以它
【解决方案2】:

只是为我刚刚遇到的奇怪的边缘情况添加这个 - 确保在从 String 转换为 Int 时字符串中没有任何尾随或前导空格。

例如。

for date in next_thirty_days {
    let date_buffer: String = date.description[8...9]
    date_list.append(Int(date_buffer)!)
}

如果 date_buffer 的值有前导或尾随空格,这将失败。

另一个极端情况是string variable 中有一个前导0,例如。 07

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2016-12-07
    • 2018-02-10
    • 2017-02-10
    • 2013-02-25
    • 1970-01-01
    • 2017-03-28
    • 2015-03-05
    相关资源
    最近更新 更多