#ios #swift #nsnumber #nsnumberformatter
Вопрос:
У меня есть финансовая строка, которую я хочу покрыть до NSNumber. Прежде чем я столкнулся с этой проблемой, я сделал это так:
extension String { var rawNumber: NSNumber? { let formatter = NumberFormatter() formatter.numberStyle = .decimal return formatter.number(from: self) } }
Когда я получаю номер от «5,7», он отлично работал на симуляторе. Возможно, из-за региона Соединенных Штатов.
Но реальное устройство с другим регионом не смогло преобразовать строку «5.7», пока я не понял, что проблема с языковым стандартом, который я использую
Поэтому я немного изменил локаль и изменил код на этот:
extension String { var rawNumber: NSNumber? { let numberFormatter = NumberFormatter() numberFormatter.locale = Locale(identifier: "en_US") numberFormatter.numberStyle = .decimal return numberFormatter.number(from: self.replacingOccurrences(of: ",", with: ".")) }
Мне нужно это число для вычисления функций, например, для умножения и т. Д. Я использую NSDecimalNumber
для этих целей.
Так что теперь мой код работает. Не уверен, хорошо ли форсировать локализацию.
Я попытался использовать NumberFormatter.separator в качестве точки и запятой для разных языков, но это не сработало для меня.
Так что просто принудительное Locale(identifier: "en_US")
выполнение работает, и строка может быть преобразована в NSNnumber
Я предположил, что если я буду использовать разные языки и разные разделители, это преобразует строку в то NSNumber.double(5.7)
, что я использовал в качестве разделителя или точки.
Я добавил необходимый блок if, чтобы поймать текущий локальный, и в зависимости от этого я использовал разные разделители, но безуспешно.
Так что, похоже Locale(identifier: "en_US")
, здесь есть только решение.
Комментарии:
1. Правильный подход будет зависеть от того, откуда берется номер и может ли это изменить форматирование, которое он использует.
en_US_POSIX
это языковой стандарт, который обычно используется для обработки ответов API.2. @CraigSiemens спасибо за комментарий! да, я согласен , что это зависит от того, что я замечаю, что форматер возвращает ноль для локали Украины, когда я указываю uk_UA и символ разделителя запятых
,
, изменяю ли я локаль или нет. Похоже, это не сработает с разделителями запятых. Честно говоря, для моих целей мне просто нужны значения в двойном стиле для расчета. Так что независимо от того, какой разделитель у меня есть. Так что для моего подходящего случаяen_US
илиen_US_POSIX
, как вы предложили, сработает.