【问题标题】:Swift – String with comma-separator to doubleSwift – 带逗号分隔符的字符串加倍
【发布时间】:2016-01-22 09:06:32
【问题描述】:

我目前有一个这样的字符串:"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)

我应该使用什么?

【问题讨论】:

    标签: string swift2 double nsnumberformatter


    【解决方案1】:

    使用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 我添加了一个进一步的代码剪辑器来解释这一点。
    • 我也得到了类似9.800000000000001的回报?
    • @jbehrens94 是的,发生了这种情况,这就是浮点数的处理方式:stackoverflow.com/questions/25657869/…
    • 好吧,有什么办法可以将其保留为最多 2 个十进制数字?
    【解决方案2】:

    “纯”斯威夫特(无基础)

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

    【讨论】:

    • 或只是str.replacingOccurrences(of: ",", with: ".")
    • @trickster77777 请看开头写的内容。 “没有基础”。那些日子(2016 年),Foundation 框架仅在与苹果不同的平台上部分可用。到目前为止,此功能是 Foundation swiftdoc.org/v4.2/type/string/… 的一部分
    【解决方案3】:

    健壮的字符串扩展

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      相关资源
      最近更新 更多