Swift Playground - 如何将带逗号的字符串转换为带小数的字符串

问题描述 投票:0回答:7

我是 Swift 世界的新手。

如何将带有逗号的字符串转换为带有小数的字符串?

代码使用点 (.) 就可以正常工作

问题是当我使用逗号(,)...时:var价格

问题的根源是十进制法语键盘使用逗号(,)而不是点(.)

不知道如何使用 NSNumberFormattergeneratesDecimalNumbers(如果它是关键)。可能有不止一种选择。

//The answer change if "2,25" or "2.25" is used.

var price      : String = "2,25"
var priceFloat = (price as NSString).floatValue

//I need to have 2.25 as answer.

var costString = String(format:"%.2f", priceFloat)

感谢您的时间和帮助!

swift string number-formatting swift-playground
7个回答
48
投票

更新:Xcode 8.2.1 • Swift 3.0.2 您可以使用 NumberFormatter() 将字符串转换为数字。您只需指定小数分隔符,如下所示:

extension String {
    static let numberFormatter = NumberFormatter()
    var doubleValue: Double {
        String.numberFormatter.decimalSeparator = "."
        if let result =  String.numberFormatter.number(from: self) {
            return result.doubleValue
        } else {
            String.numberFormatter.decimalSeparator = ","
            if let result = String.numberFormatter.number(from: self) {
                return result.doubleValue
            }
        }
        return 0
    }
}


"2.25".doubleValue // 2.25
"2,25".doubleValue // 2.25

let price = "2,25"
let costString = String(format:"%.2f", price.doubleValue)   // "2.25"

您还应该使用 NumberFormat 进行货币格式化,因此创建一个扩展 FloatingPoint 协议的只读计算属性货币,以从 String doubleValue 属性返回格式化的字符串。

extension NumberFormatter {
    convenience init(style: Style) {
        self.init()
        self.numberStyle = style
    }
}
extension Formatter {
    static let currency = NumberFormatter(style: .currency)
}
extension FloatingPoint {
    var currency: String {
        return Formatter.currency.string(for: self) ?? ""
    }
}

let costString = "2,25".doubleValue.currency   // "$2.25"

Formatter.currency.locale = Locale(identifier: "en_US")
"2222.25".doubleValue.currency    // "$2,222.25"
"2222,25".doubleValue.currency    // "$2,222.25"

Formatter.currency.locale = Locale(identifier: "pt_BR")
"2222.25".doubleValue.currency    // "R$2.222,25"
"2222,25".doubleValue.currency    // "R$2.222,25"

8
投票

您可以使用此Swift 3

let currentAmount = "2,50"

currentAmount = currentAmount.replacingOccurrences(of: ",", with: ".")

print(currentAmount) // "2.50\n"

5
投票
var price = "2,25"
price = price.replacingOccurrences(of: ",", with: ".")
var priceFloat = (price as NSString).floatValue

1
投票

可为空的扩展版本:

extension String 
{
    static let customNumberFormatter = NumberFormatter()
    var doubleValue: Double? {
        String.customNumberFormatter.decimalSeparator = "."
        if let result =  String.customNumberFormatter.number(from: self) {
            return result.doubleValue
        } else {
            String.customNumberFormatter.decimalSeparator = ","
            if let result = String.customNumberFormatter.number(from: self) {
                return result.doubleValue
            }
        }
        return nil
    }
}

0
投票

已接受答案的简化版本,出于安全原因,我还将 numberFormatter 设为私有。

extension String {
    private static let numberFormatter = NumberFormatter()

    var doubleValue: Double {
        String.numberFormatter.decimalSeparator = "."
    
        if let result = String.numberFormatter.number(from: self) {
            return result.doubleValue
        }
        String.numberFormatter.decimalSeparator = ","
        return String.numberFormatter.number(from: self)?.doubleValue ?? 0
    }
}

0
投票

我喜欢这种简单的方法

extension Double {
        func removeZerosFromEnd() -> String {
            let formatter = NumberFormatter()
            let number = NSNumber(value: self)
            formatter.minimumFractionDigits = 1
            formatter.maximumFractionDigits = 16
            formatter.decimalSeparator = "."
            return String(formatter.string(from: number) ?? "")
        }
    }

从末尾删除零并使用点作为分隔符而不是逗号


-2
投票

编辑:已更新以与当前版本的 Swift 配合使用:

let amount = "8,35"

var counter: Int = 0
var noCommaNumber: String!
for var carattere in (amount) {
    if carattere == "," { carattere = "." }
    if counter != 0 { noCommaNumber = "\(noCommaNumber ?? "\(carattere)")" + "\(carattere)" } else { noCommaNumber = "\(carattere)" } // otherwise first record will always be nil
    counter += 1
}

let importo = Float(noCommaNumber)
© www.soinside.com 2019 - 2024. All rights reserved.