ios - 在 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,但不确定如何/是否可以在这里使用它。)
我觉得我正在尝试重新发明轮子...
解决方案
结合 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)
(上面的示例是为处理德语格式的数字而编写的,带有逗号小数分隔符。)
但是,如果您正在处理用于向服务器发送/接收的固定数字格式,这可能并不重要。
推荐阅读
- asynchronous - 我怎样才能让while循环等待未来.:WITHOUT:. 使函数异步?
- angular - 如何有效地将参数添加到我的 Angular 7 路由?
- c++ - 如何轻松地将 Base 方法重定向到相同的 Derived 类方法?
- c# - MSMQ - 尝试接收消息时出错
- graphql - 从markdown文件映射到列表的graphql输出
- r - 如何以“Wednesday-September 7-2011”等格式处理日期
- r - 如何在 ggplot 折线图中注释累积向量的最终值?
- android - .addOnCompleteListener 不适用于 FirebaseInstanceId.getInstance().getInstanceId()
- javascript - 如何获取文本区域的行并将它们放入左右对齐的一组元素中,该元素在“:”上为每一行拆分?
- python - Matplotlib 不会将数据完全呈现为正方形