var App = App || {};
App = {
getDataFromServer: function(){
var self = this,
deferred = $.Deferred(),
requests = [];
requests.push($.getJSON('request/ajax/url/1'));
requests.push($.getJSON('request/ajax/url/2'));
$.when.apply(jQuery, requests).done(function(xhrResponse) {
return deferred.resolve(xhrResponse.result);
});
return deferred;
},
init: function(){
this.getDataFromServer().done(_.bind(function(resp1, resp2) {
// Do the operations which you wanted to do when you
// get a response from Ajax, for example, log response.
}, this));
}
};
App.init();
Вероятно, это дубликат этого ответа , но поскольку оригинал находится в Objective-C, вот версия Swift:
let label = "23,07"
let formatter = NSNumberFormatter()
let maybeNumber = formatter.numberFromString(label)
if let number = maybeNumber {
println(number) // 23.07
}
Swift 4, без использования preferredLanguages у меня были проблемы с fr_US и decimalPad
extension String {
func number(style: NumberFormatter.Style = .decimal) -> NSNumber? {
return [[Locale.current], Locale.preferredLanguages.map { Locale(identifier: $0) }]
.flatMap { $0 }
.map { locale -> NSNumber? in
let formatter = NumberFormatter()
formatter.numberStyle = style
formatter.locale = locale
return formatter.number(from: self)
}.filter { $0 != nil }
.map { $0! }
.first
}
}
textfield.text?.number()?.floatValue
Никто действительно не обратился к проблеме напрямую.
То есть десятичный разделитель является условным обозначением для локали.
iOS поддерживает номера форматирования на основе определенной локали.
Если вы работаете исключительно в определенной локали, тогда все должно работать правильно. Клавиатура должна принимать номера с правильным десятичным разделителем.
Если вы в большинстве стран Европы, например, вводите запятую в качестве разделителя с десятичной запятой. Ввод точки в этих странах неверен. Кто-то из одной из этих стран не сделал бы этого, потому что это неправильный разделитель десятичной дроби. Европейский пользователь будет знать, как использовать запятую в качестве разделителя десятичных чисел, и вам не нужно ничего делать.
Если вы находитесь в США, вы должны использовать период. Использование запятой в США было бы неправильным.
Способ отображения десятичного числа с помощью форматирования чисел. Когда вы создаете форматировщик чисел, он по умолчанию использует текущий язык.
Если вам нужно преобразовать строку, содержащую десятичное число из одного языкового стандарта в другой, вы должны использовать 2 форматирования чисел. Используйте форматирование в исходной локали, чтобы преобразовать строку в float. Затем используйте форматтер с языковой точкой назначения, чтобы преобразовать число в строку в выходном формате.
Просто создайте один форматированный номер в текущем локали по умолчанию и создайте второй форматировщик числа и установите его локально явно другой язык, который вы хотите использовать.
Решение, которое я нашел:
let nf = NumberFormatter()
nf.locale = Locale.current
let numberLocalized = nf.number(from: txtAlcool.text!)
В моем случае я тестировал xcode, и все идет нормально, но при тестировании на устройстве он рушился. Все, потому что в Бразилии мы используем метрическую систему, запятую разделяем десятичную ",". С помощью этого решения он автоматически преобразуется из запятой в точку.
Swift 3: float или double value для строки, содержащей плавающую точку с запятой
extension String {
var floatValue: Float {
let nf = NumberFormatter()
nf.decimalSeparator = "."
if let result = nf.number(from: self) {
return result.floatValue
} else {
nf.decimalSeparator = ","
if let result = nf.number(from: self) {
return result.floatValue
}
}
return 0
}
var doubleValue:Double {
let nf = NumberFormatter()
nf.decimalSeparator = "."
if let result = nf.number(from: self) {
return result.doubleValue
} else {
nf.decimalSeparator = ","
if let result = nf.number(from: self) {
return result.doubleValue
}
}
return 0
}
}
Пример:
"5,456".floatValue //5.456
"5.456".floatValue //5.456
"5,456".doubleValue //5.456
"5.456".doubleValue //5.456
"5,456".doubleValue.rounded() //5
"5,6".doubleValue.rounded() //6
Вы можете преобразовать его с помощью NumberFormatter
и фильтрации разных десятичных разделителей:
func getDoubleFromLocalNumber(input: String) -> Double {
var value = 0.0
let numberFormatter = NumberFormatter()
let decimalFiltered = input.replacingOccurrences(of: "٫|,", with: ".", options: .regularExpression)
numberFormatter.locale = Locale(identifier: "EN")
if let amountValue = numberFormatter.number(from: decimalFiltered) {
value = amountValue.doubleValue
}
return value
}
let number = NSNumberFormatter()
let locale = NSLocale.currentLocale()
let decimalCode = locale.objectForKey(NSLocaleDecimalSeparator) as! NSString
number.decimalSeparator = decimalCode as String
let result = number.numberFromString(textField.text!)
let value = NSNumberFormatter.localizedStringFromNumber(result!.floatValue, numberStyle: .DecimalStyle)
print(value)
Надеюсь, это поможет вам:)