Исключение с NumberFormatter с использованием .spellout в Swift

Я тестирую некоторые строки, такие как один, два, три, семь и т. д., чтобы увидеть, являются ли они числами, используя приведенный ниже код. Это работает нормально, если строка на самом деле является числом, но происходит сбой, когда строка не является числом, как в слове «сбережения».

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

Вот мой код:

public extension NSString {
    public var asNum: NSNumber {
               // let stringValue = String(value: self)
                let stringValue = self
                let formatter = NumberFormatter()
                formatter.isLenient = true
                formatter.numberStyle = .spellOut
                let num = formatter.number(from: stringValue as String)!///EXCEPTION
                return num
            }
        }

Исключение гласит:

Fatal error: Unexpectedly found nil while unwrapping an Optional value

В отладчике я могу убедиться, что stringValue является «сбережением».

Спасибо за любые предложения.

если строковое значение равно «сбережениям», что вы ожидаете, заставляя развернуть результат?

Leo Dabus 18.03.2019 03:09

попробуй return formatter.number(from: stringValue) ?? 0

Leo Dabus 18.03.2019 03:11

объединение предотвращает исключение: return formatter.number(from: stringValue as String) ?? 0 Единственная проблема заключается в том, что 0 вводит в заблуждение, поскольку его можно интерпретировать как ноль, что часто встречается в этом случае использования. Думаю, я застрял с выбором какого-то странного маловероятного числа...

user6631314 18.03.2019 03:37

Стандартный подход в Swift будет возвращать необязательный номер. private var number: NSNumber? {

Leo Dabus 18.03.2019 03:48

Кстати, вы не должны объявлять средство форматирования чисел внутри вашего вычисляемого свойства. Это будет создавать новый модуль форматирования каждый раз, когда вы вызываете это свойство.

Leo Dabus 18.03.2019 03:50

Метод вызывается из файла Objective-c. Я не думаю, что он может обрабатывать опции. Это правильно?

user6631314 18.03.2019 03:51

Я ничего не знаю о смешивании obj-c и Swift

Leo Dabus 18.03.2019 03:52

Код на самом деле находится в расширении. Где еще тогда, где он может создать экземпляр форматера?

user6631314 18.03.2019 03:54
stackoverflow.com/a/27705739/2303865
Leo Dabus 18.03.2019 03:56

Да, Objective-C может обрабатывать необязательное NSNumber. Он будет возвращен как nil.

rmaddy 18.03.2019 04:02

вы должны использовать let num = formatter.number(from: stringValue as String) ?? 0 вместо этого кода

mohsen 18.03.2019 06:21

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

clarus 19.03.2019 04:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
154
0

Другие вопросы по теме