Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中从字符串中提取Float_Swift - Fatal编程技术网

在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
}