Swift - 将逗号分隔的字符串转换为双精度数

10

我目前有一个像这样的字符串:"8,0""4,25",我需要将其转换为Double,但我该如何做呢?

我已经看过了NSNumberFormatter,但它对每个字符串都返回nil

let formatter = NSNumberFormatter()
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
let grade = formatter.numberFromString(grade["Cijfer"].stringValue)
print(grade)

我该用什么?

4个回答

18

使用decimalSeparator

let formatter = NSNumberFormatter()
formatter.decimalSeparator = ","
let grade = formatter.numberFromString("2,3")

if let doubleGrade = grade?.doubleValue {
    print(doubleGrade)
} else {
    print("not parseable")
}

打印

2.3


然后我可以将NSNumber转换为Double吗? - jbehrens94
@jbehrens94 我附加了更多的代码片段来解释。 - luk2302
我也会得到类似于 9.800000000000001 的返回值吗? - jbehrens94
@jbehrens94 是的,发生这种情况是因为浮点数是这样处理的: http://stackoverflow.com/questions/25657869/why-is-swift-giving-me-inaccurate-floating-point-arithmetic-results - luk2302
好的,有没有办法让它最多保留两位小数? - jbehrens94
@jbehrens94,9.8在二进制中无法准确表示。这不应该引起任何问题。请接受我的答案,因为它回答了你的问题。处理浮点数是一个完全不同的话题。 - luk2302

8

'纯' Swift (无 Foundation)

let str = "9,8"
let sstr = str.characters.split(",").joinWithSeparator(["."])
if let d = Double(String(sstr)) {
    print(d) // 9.8
}

9
或者只需使用 str.replacingOccurrences(of: ",", with: ".") 替换逗号为句点。 - trickster77777
@trickster77777,请看一下开头写的内容。“没有Foundation”。在2016年,Foundation框架只在与苹果不同的平台上部分可用。直到现在,这个函数已经成为Foundation的一部分了。https://swiftdoc.org/v4.2/type/string/#func-replacingoccurrences-of_with_options_range_ - user3441734

1

强大的字符串扩展

extension String {
    var preparedToDecimalNumberConversion: String {
        split {
            !CharacterSet(charactersIn: "\($0)").isSubset(of: CharacterSet.decimalDigits)
        }.joined(separator: ".")
    }
}

func testPreparingToDecimalNumberConversion() {
    XCTAssertEqual("25.5".preparedToDecimalNumberConversion, "25.5")
    XCTAssertEqual("25,5".preparedToDecimalNumberConversion, "25.5")
    XCTAssertEqual("...,,,25,5,,,".preparedToDecimalNumberConversion, "25.5")
    XCTAssertEqual("25.5,42,..".preparedToDecimalNumberConversion, "25.5.42")
    XCTAssertEqual(".42,..".preparedToDecimalNumberConversion, "42")
    XCTAssertEqual(".36,,,6,..".preparedToDecimalNumberConversion, "36.6")
    XCTAssertEqual("36......6".preparedToDecimalNumberConversion, "36.6")
    XCTAssertEqual("36.,.,.,6".preparedToDecimalNumberConversion, "36.6")

    XCTAssertEqual(Float("25.5".preparedToDecimalNumberConversion), 25.5)
    XCTAssertEqual(Float("25,5".preparedToDecimalNumberConversion), 25.5)
    XCTAssertEqual(Float("...,,,25,5,,,".preparedToDecimalNumberConversion), 25.5)
    XCTAssertEqual(Float("25.5,42,..".preparedToDecimalNumberConversion), nil)
    XCTAssertEqual(Float(".42,..".preparedToDecimalNumberConversion), 42)
}

1
当我遇到这个错误时,我使用这段代码找到了一个解决方案。

stringValue.toDouble()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接