Валютный фомат в Swift

Я работаю над приложением, в котором мне нужно отображать валюту в формате ниже

$ 222,345.00   (Symbole depends on location/country. May be $,R etc)

Я пытаюсь установить, используя приведенный ниже код

    let formatter = NumberFormatter()
    formatter.locale = Locale.current
    formatter.numberStyle = .currency

    if let formattedTipAmount = formatter.string(from: NSNumber(value:amountDouble)) {
       self.amountLabel.text= "\(formattedTipAmount)"
    }

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

Подскажите, пожалуйста, что я делаю не так.

В некоторых странах (например, в Германии) запятая является является десятичным разделителем, и по умолчанию разделитель группировки не используется. - Значит, вы, скорее всего, ничего плохого не делаете.

Martin R 02.07.2018 16:51

@MartinR да, но требуется добавить. для десятичного разделителя и для разделителя чисел

Gagan_iOS 02.07.2018 16:54

Затем установите соответствующие свойства NumberFormatter. Все это можно настроить.

Martin R 02.07.2018 16:55

@MartinR, пожалуйста, объясните, если возможно.

Gagan_iOS 02.07.2018 16:56

@Gagan_iOS Ваше требование плохое. Это сбивает с толку большинство пользователей вашего приложения. Пожалуйста, убедите любого, кто принял решение, что ему нужно пересмотреть свой выбор. Пусть NumberFormatter выполнит свою работу и покажет валюту в ожидаемом формате для локали пользователя.

rmaddy 02.07.2018 17:22

@rmaddy Я не согласен, по крайней мере, для некоторых сценариев, поскольку, например, я думаю, что было бы запутанно, если бы у меня был столбец в таблице с суммами, а формат менялся от строки к строке в зависимости от валюты. Было бы очень трудно читать.

Joakim Danielson 03.07.2018 10:52

@JoakimDanielson Я вообще этого не предлагаю. Все валюты будут отформатированы одинаково, но это форматирование должно основываться на локали зрителя, а не на каком-то жестком коде, выбранном каким-либо менеджером, который не понимает локализацию.

rmaddy 03.07.2018 17:56
Стоит ли изучать 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
7
77
1

Ответы 1

Хорошо, поэтому поведение символа "," для некоторых мест (думаю, почти для всей Европы) является правильным. Чтобы убедиться, что у больших чисел также есть разделитель (в Европе это будет.), Вы должны добавить атрибут usesGroupSeperator для NumberFormatter. Итак, чтобы это работало с вашим кодом, вам нужно будет изменить его на следующее:

let formatter = NumberFormatter()
formatter.locale = Locale.current
formatter.numberStyle = .currency
formatter.usesGroupingSeparator = true

if let formattedTipAmount = formatter.string(from: NSNumber(value:amountDouble)) {
   self.amountLabel.text= "\(formattedTipAmount)"
}

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

formatter.currencyGroupingSeparator = ","
formatter.currencyDecimalSeparator = "."

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

rmaddy 03.07.2018 18:30

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

NoSixties 04.07.2018 00:33

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