首页 > 解决方案 > 在 Swift 中从字符串中解析多个双精度数

问题描述

在 Swift 中从字符串(在 UITextView 中输入)解析多个双精度并将它们放入双精度数组中的最简单/最干净的方法是什么?

假设用户输入“23.4 45 16.997 -32”。当他进入时,我想要

doubleArray[0] = 2
doubleArray[0] = 23
doubleArray[0] = 23.
doubleArray[0] = 23.4
doubleArray[1] = 4
doubleArray[1] = 45

等等

我有

var dataArray = [""]
dataArray = inputString.components(separatedBy: " ")

它可以很好地将数据分成一个字符串数组,然后我可以将每个字符串转换为双精度数。但是有没有更简洁更简洁的方法?

另外,有没有一种方法可以轻松地实时验证进入 UITextView 的数据?例如,不允许在条目中使用多个小数点或负号、没有字母等?

现在我正在使用

let decimalPoint = NSLocale.current.decimalSeparator! as String
let validChars : Set<Character> = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", decimalSeparator[0], " "]  

validChar = Set(inputString).isSubset(of: validChars)
If !validChar {
    inputString.deleteBackward()
    //display Error Message
}

当然,这还需要确保没有小数点或负号……等等。所有简单的步骤,但没有更简单的东西吗?!?(这也大大简化了 - 我实际上有特定的错误消息,例如“只允许一个小数分隔符”、“无效字符”等)

(我也在其他情况下玩过 NSNumber,但不确定如何/是否可以在这里使用它。)

我觉得我正在尝试重新发明轮子...

标签: iosswift

解决方案


结合 Leo 和 Martin 的答案:

let arrayOfDoubles = "This costs US$ 7.99"
  .components(separatedBy:.whitespacesAndNewlines)
  .compactMap{Double($0)}

应该工作和处理多种空白,如空格、不间断空格、制表符和换行符。

根据 Martin R 的说法,它不会处理语言环境的不同数字格式。

您可以将 NumberFormatter 添加到组合中:

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "de")

let arrayOfDoubles = "7 3,4 12,2 9 2,3"
    .components(separatedBy:.whitespacesAndNewlines)
    .compactMap{ formatter.number(from: $0).map { $0.doubleValue } }

print(arrayOfDoubles)

(上面的示例是为处理德语格式的数字而编写的,带有逗号小数分隔符。)

但是,如果您正在处理用于向服务器发送/接收的固定数字格式,这可能并不重要。


推荐阅读