Финансовая строка для NSNumber NSNumberFormatter не работает для разных регионов

#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 , как вы предложили, сработает.