在 swift 中将字符串类型数组转换为浮点型数组 无法将类型"字符串"的值分配给类型为"双精度"的下标



如何将具有字符串类型值的"数字字符串"数组转换为具有浮点类型值的"数字浮点"数组

问题是我一直收到"无法将'字符串'类型的值分配给'双精度'类型的下标"作为错误

我知道我无法将 Float 值输入到字符串下标,但我也不能更改字符串,因为它们是逗号分隔的并且无法将值放入数组中

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])!
}
}

这有效,但它不是很敏捷。使用 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属性,创建格式化程序时,区域设置设置为当前设备区域设置。但是小数点分隔符在不同的国家/地区有所不同。当一切对您甚至 QA 都有效,但对生产中的用户不起作用时,它可能会导致非常令人不快的错误。因此,以描述的方式控制字符串到双精度转换始终是最佳选择。

最新更新