在 swift 中将 String 类型数组转换为 Float 类型数组 不能将类型 'String' 的值分配给类型 'Double' 的下标。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 swift 中将 String 类型数组转换为 Float 类型数组 不能将类型 'String' 的值分配给类型 'Double' 的下标。相关的知识,希望对你有一定的参考价值。

如何将具有字符串类型值的 "numbersString "数组转换为具有浮动类型值的 "numbersFloat "数组?

问题是,我一直收到 "无法将类型'String'的值分配给类型'Double'的下标 "的错误信息。

我明白,我不能把Float值输入到String下标中,但我既不能改变String,因为它们是逗号隔开的,也不能把值放在数组中。

var numbersString = [["564,00", "577,00", "13,00"], ["563,00", "577,00", "14,00"]] → I have
var numbersFloat = [[564.00, 577.00, 13.00], [563.00, 577.00, 14.00]] → I need

我尝试过的事情。

for row in 0...numbersString.count-1 
    for col in 0...numbersString[0].count-1 
        numbersFloat[row][col] = numbersString[row][col]
    

Error: Cannot assign value of type 'String' to subscript of type 'Double'
for row in 0...numbersString.count-1 
    for col in 0...numbersString[0].count-1 
            var a = table[row][col]
            table[row][col] = Float(a)
    

答案

你可以使用 NumberFormatter 来处理包含使用逗号作为十进制分隔符的浮点数的字符串。我通常会将自定义格式化器封装在一个类中。它看起来像这样。

class FloatFormatter 
    let formatter: NumberFormatter
    init() 
        formatter = NumberFormatter()
        formatter.decimalSeparator = ","
    

    func float(from string: String) -> Float? 
        formatter.number(from: string)?.floatValue
    

把这个代入到你的示例代码中(修正了你的浮点数组的类型),你会得到。

var numbersString = [["564,00", "577,00", "13,00"], ["563,00", "577,00", "14,00"]]
var numbersFloat: [[Float]] = [[564.00, 577.00, 13.00], [563.00, 577.00, 14.00]]

let floatFormatter = FloatFormatter()
for row in 0...numbersString.count-1 
    for col in 0...numbersString[0].count-1 
        numbersFloat[row][col] = floatFormatter.float(from: numbersString[row][col])!
    

这能用,但不是很Swifty。使用map会更好(这样你就不需要担心匹配数组的大小和预分配浮动数组)。

let floatFormatter = FloatFormatter()
let numbersString = [["564,00", "577,00", "13,00"], ["563,00", "577,00", "14,00"]]
let numbersFloat = numbersString.map  (row: [String]) -> [Float] in
    return row.map  stringValue  in
        guard let floatValue = floatFormatter.float(from: stringValue) else 
            fatalError("Failed to convert \(stringValue) to float.")
        
        return floatValue
    

另一答案

也许你想要这样的东西?

var numbersString = [["564.00", "577.00", "13.00"], ["563.00", "577.00", "14.00"]]

var numbersFloat: [[Float]] = Array(repeating: Array(repeating: 0.0, count: numbersString[0].count), count: numbersString.count)

print(numbersFloat.count)
for row in 0...numbersString.count - 1 
    for col in 0...numbersString[0].count - 1 

        print(row, col, numbersString[row][col])
        print(Float(numbersString[row][col]) ?? 0)
        numbersFloat[row][col] =  Float(numbersString[row][col]) ?? 0
    

另一答案

这将与". "和", "分隔符一起工作。

var numbersString = [["564,00", "577,00", "13,00"], ["563,00", "577,00", "14,00"]]

let numberFormatter = NumberFormatter()
let decimalSeparator = ","
numberFormatter.decimalSeparator = decimalSeparator

let numbersFloat = numbersString.map( $0.compactMap( numberFormatter.number(from: $0.replacingOccurrences(of: ".", with: decimalSeparator))?.floatValue ))

给大家介绍一下。NumberFormatter有 .locale 属性,并且在创建formatter时,locale被设置为当前设备的locale。但不同国家的小数点分隔符不同。这可能会导致非常不愉快的错误,当一切对你甚至对QA来说都是好的,但对生产中的用户来说却不工作。因此,最好的办法是通过上述方式控制字符串到双数的转换。

以上是关于在 swift 中将 String 类型数组转换为 Float 类型数组 不能将类型 'String' 的值分配给类型 'Double' 的下标。的主要内容,如果未能解决你的问题,请参考以下文章

在swift 3中将字符串转换为日期类型[重复]

在for循环中将PFFile数组转换为UIImage返回空数组Swift

在swift 3中将数组转换为段标题

如何在 Swift 中将数据转换为 Doubles、Ints 和 Strings 等类型?

如何在 Swift 中将 NSURL 转换为字符串

如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?