在Swift中从字符串中提取Float
我能够使用以下代码提取数字:在Swift中从字符串中提取Float,swift,Swift,我能够使用以下代码提取数字: let weightt = x.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "") 例如,我从字符串“0.1kg”中得到“01” 但是如何从字符串“0.1kg”中提取“0.1”?您可以使用 输入 let x = "0.1kg" let weightt = x.components(separatedBy: CharacterSet.init(cha
let weightt = x.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
例如,我从字符串“0.1kg”中得到“01”
但是如何从字符串“0.1kg”中提取“0.1”?您可以使用
输入
let x = "0.1kg"
let weightt = x.components(separatedBy: CharacterSet.init(charactersIn: "0123456789.").inverted).joined(separator: "")
输出
0.1
使用
如果要从weight中删除所有字符,请使用代码。表示如果是gm
而不是kg
let result = string.stringByReplacingOccurrencesOfString("[^A-Za-z]", withString: "",
options: NSStringCompareOptions.RegularExpressionSearch, range:nil).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
也可以尝试以下方法:
let str = "0.1kg"
let decimal = str.components(separatedBy: CharacterSet.init(charactersIn: "0123456789.").inverted).first.flatMap { Float($0) }
print(decimal ?? "")
您没有提到输入的约束,所以我假设它是一个有效的十进制数,后跟一个单位 如果出现以下情况,可以使用
前缀执行此操作:
let weight = "0.1kg"
let result = String(weight.characters.prefix {
"012346789.".characters.contains($0)) })
一个好的方法是使用。
例如:
scanDouble()
/scanFloat()
方法解析所有类型的
浮点表示法(+12.34
,-56.78
,1.23e4
,1,23
等),
跳过初始空白,支持多个区域设置,并尽可能多地扫描给定字符串。数字是否始终位于字符串的开头,或者数字是否可以位于字符串中的任何位置?您应该使用需要处理的字符串的多个示例更新您的问题。不同的解决方案可能无法处理所有可能需要处理的输入。正则表达式无效。你是说用“[^A-Za-z]”
查找任何非字母的内容吗?除了调试输出之外,使用.description
进行任何操作都会让我觉得有点代码味道(正式不保证确切的描述格式)。使用字符串(weight.characters.prefix{“012346789.”.characters.contains($0)})可以实现同样的效果。非常感谢。这不能很好地本地化。例如,法语在格式化的数字中使用空格和逗号,更不用说其他使用非西方数字字符的语言了。@BenLachman也许你是对的,但我已经按照问题回答了。如果你有更好的解决方案,请随时更新我的答案。我将不胜感激。或者稍后我会更新它,因为现在我正在度假:)使用扫描仪是正确的解决方案。虽然这适用于原始问题中的单个案例,但有大量案例根本不起作用(例如“$1.56”)@BenLachman,我已根据用户问题要求回答。如果您注入了超出范围的其他场景。所以要求你取消你的否决票。重点不是回答确切的问题。重点是给出一个好的解决方案,考虑到好的软件工程的更大问题。目标应该始终是为每个答案添加尽可能多的知识。这是正确的答案,并支持其他区域/语言的正确行为。这看起来非常优雅。但是如何扫描字符串中的下一个数字呢?你能告诉扫描器前进到下一个号码吗?
let weight = "0.1kg"
let result = String(weight.characters.prefix {
"012346789.".characters.contains($0)) })
let string = " 0.1 kg"
let scanner = Scanner.localizedScanner(with: string)
var weight = 0.0
if scanner.scanDouble(&weight) {
print(weight) // 0.1
}