Swift playground - как преобразовать строку с запятой в строку с десятичной запятой

Я новичок в мире Swift.

Как преобразовать строку с запятой в строку с десятичным числом?

работа кода в порядке с точкой (.)

проблема в том, что я использую запятую (,)... с: var цена

источником проблемы является десятичная французская клавиатура, использующая запятую (,) вместо точки (.)

Не знаю точно, как использовать NSNumberFormatter или generatesDecimalNumbers если это ключ. Есть probebly более одного варианта.

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

Спасибо за ваше время и помощь!

4 ответов


обновление: Xcode 8.2.1 * Swift 3.0.2 Вы можете использовать NumberFormatter() для преобразования строки в number. Вам просто нужно указать decimalSeparator следующим образом:

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, поэтому создайте только для чтения вычисляемое свойство currency, расширяющее протокол 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   // ".25"

Currency.formatter.locale = Locale(identifier: "en_US")
"2222.25".doubleValue.currency    // ",222.25"
"2222,25".doubleValue.currency    // ",222.25"

Currency.formatter.locale = Locale(identifier: "pt_BR")
"2222.25".doubleValue.currency    // "R.222,25"
"2222,25".doubleValue.currency    // "R.222,25"

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

вы можете использовать для этого Swift 3:

let currentAmount = 2,50

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

print(currentAmount) // 2.50

или, если вам не нравятся расширения:

    let price = "2,25"

    var counter: Int = 0
    var noCommaNumber: String!
    for var Character in price.characters {
        if Character == "," { Character = "." }
        if counter != 0 { noCommaNumber = "\(noCommaNumber)" + "\(Character)" } else { noCommaNumber = "\(Character)" }
        counter++
    }

    importo = Float(noCommaNumber)
    let costString = String(format:"%.2f", importo)