UITextField не возвращает числовое значение из-за iOS 11 new & ldquo; coma & rdquo; в десятичной колодке [дубликат]

Вот некоторые подходы к работе с асинхронными запросами:
  1. Объект обезьяны браузера
  2. Q - A
  3. A + Promises.js
  4. jQuery отложен
  5. API XMLHttpRequest
  6. Использование концепции обратного вызова - как реализация в первом ответе

Пример: jQuery отложенная реализация для работы с несколькими запросами

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();
4
задан Moritz 10 May 2015 в 12:36
поделиться

8 ответов

Вероятно, это дубликат этого ответа , но поскольку оригинал находится в Objective-C, вот версия Swift:

let label = "23,07"
let formatter = NSNumberFormatter()
let maybeNumber = formatter.numberFromString(label)
if let number = maybeNumber {
    println(number)   // 23.07
}
13
ответ дан Community 27 August 2018 в 01:06
поделиться

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
0
ответ дан Arnaud Dorgans 27 August 2018 в 01:06
поделиться

Никто действительно не обратился к проблеме напрямую.

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

iOS поддерживает номера форматирования на основе определенной локали.

Если вы работаете исключительно в определенной локали, тогда все должно работать правильно. Клавиатура должна принимать номера с правильным десятичным разделителем.

Если вы в большинстве стран Европы, например, вводите запятую в качестве разделителя с десятичной запятой. Ввод точки в этих странах неверен. Кто-то из одной из этих стран не сделал бы этого, потому что это неправильный разделитель десятичной дроби. Европейский пользователь будет знать, как использовать запятую в качестве разделителя десятичных чисел, и вам не нужно ничего делать.

Если вы находитесь в США, вы должны использовать период. Использование запятой в США было бы неправильным.

Способ отображения десятичного числа с помощью форматирования чисел. Когда вы создаете форматировщик чисел, он по умолчанию использует текущий язык.

Если вам нужно преобразовать строку, содержащую десятичное число из одного языкового стандарта в другой, вы должны использовать 2 форматирования чисел. Используйте форматирование в исходной локали, чтобы преобразовать строку в float. Затем используйте форматтер с языковой точкой назначения, чтобы преобразовать число в строку в выходном формате.

Просто создайте один форматированный номер в текущем локали по умолчанию и создайте второй форматировщик числа и установите его локально явно другой язык, который вы хотите использовать.

7
ответ дан Duncan C 27 August 2018 в 01:06
поделиться
1
ответ дан giudigior 27 August 2018 в 01:06
поделиться

Решение, которое я нашел:

let nf = NumberFormatter()
nf.locale = Locale.current
let numberLocalized = nf.number(from: txtAlcool.text!)

В моем случае я тестировал xcode, и все идет нормально, но при тестировании на устройстве он рушился. Все, потому что в Бразилии мы используем метрическую систему, запятую разделяем десятичную ",". С помощью этого решения он автоматически преобразуется из запятой в точку.

1
ответ дан Paulo Cassin 27 August 2018 в 01:06
поделиться

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
1
ответ дан Peter Kreinz 27 August 2018 в 01:06
поделиться

Вы можете преобразовать его с помощью 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
}
0
ответ дан Soheil Novinfard 27 August 2018 в 01:06
поделиться
        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)

Надеюсь, это поможет вам:)

0
ответ дан xcodeUSER 27 August 2018 в 01:06
поделиться