Преобразовать Double в массив цифр

Есть ли простой способ конвертировать

var amount : Double = 78.58

кому: var array = ["7", "8", "5", "8"]

или var array = [7, 8, 5, 8]

а наоборот?

Какова цель конверсии? Знаете ли вы, что большинство десятичных дробей не представляются в точности как двоичные числа с плавающей запятой? Попробуйте let amount = 0.3 - 0.2; print(amount).

Martin R 24.07.2019 18:34

Все данные у меня есть в формате "12.34". У меня есть 4 средства выбора, в которых я хочу отобразить и отредактировать это (01.23 или 1.23 невозможно). Но спасибо за предупреждение!

arakweker 24.07.2019 18:41

Вы имеете в виду, что вам нужен выходной массив из 4 цифр? с [0,0,0,0] на [9,9,9,9]?

ielyamani 24.07.2019 18:46

Да, ты прав.

arakweker 24.07.2019 18:49

Было бы лучше сохранить 4 цифры как целое число (0-9999) и избежать всех проблем с округлением.

Martin R 24.07.2019 19:02
Стоит ли изучать 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
5
104
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ты можешь попробовать

let amount = 78.58
let res = "\(amount)".compactMap { $0 ==  "." ? nil : $0  } 
print(res)

Для внутр.

let res =  "\(amount)".compactMap { Int("\($0)") } 

За let amount = 0.3 - 0.2 вы получите результат ["0", "0", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "9", "8"]

Martin R 24.07.2019 18:29

@MartinR да, это произойдет, но оператор может дать отзыв, если его двойник будет таким, если да, используйте floor / ceil / round

Sh_Khan 24.07.2019 18:31

Это также не работает с научной записью значений с плавающей запятой, попробуйте let amount = Double.greatestFiniteMagnitude

Martin R 24.07.2019 18:31

Почему бы не просто compactMap(Int.init)?

Leo Dabus 24.07.2019 18:36

@LeoDabus compactMap{Int($0)} имеет меньше символов

Sh_Khan 24.07.2019 18:38

А что, если результат должен быть [7, 8, 5, 8]?

arakweker 24.07.2019 18:46

@LeoDabus, твоя попытка дает ошибку сигментации

Sh_Khan 24.07.2019 18:49

@Sh_Khan: вы имеете в виду: 'let b = "78.58".compactMap{Int($0)}'? Это дает ошибку «Инициализатор init (_: radix:)» требует, чтобы «String.Element» (он же «Character») соответствовал «StringProtocol».

arakweker 24.07.2019 18:52
let res = "\(amount)".compactMap { Int("\($0)") }
Sh_Khan 24.07.2019 18:53

Понятно. Прекрасно работает!

arakweker 24.07.2019 18:58

Да, забыл, что у Int нет инициализатора символов. Обратите внимание, что для Свифт 5 или новее вы можете использовать свойство CharacterwholeNumberValue. Нет необходимости преобразовывать символ в строку. compactMap{$0.wholeNumberValue}

Leo Dabus 24.07.2019 19:13

Вы также можете просто использовать метод описания для Double, чтобы получить объект String и работать с ним:

let amount = 78.58
let result = amount.description //result = "78.58"

Теперь вы можете перебирать символы в строке:

for char in result {
    print("Found character: \(char)")
}

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

let elements = String(amount).map { String($0)}
let amount2 = elements.joined()

Более продвинутое решение для различной точности

func splitDouble(_ value: Double, precision: Double) -> [String] {
    let factor = pow(10, precision)
    let rounded = round(value * factor) / factor
    return String(rounded).map { String($0) }
}

Благодарю вас! Особенно для «присоединенного» наконечника. В моем случае формат всегда «12,34» или «12,34» (в зависимости от языка). Так что нет проблем с сохранением или потерей десятичного разделителя. Я попытаюсь найти различия между вашим подходом .map и подходом compactMap, который предлагают другие.

arakweker 24.07.2019 19:08

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