Есть ли простой способ конвертировать
var amount : Double = 78.58
кому: var array = ["7", "8", "5", "8"]
или var array = [7, 8, 5, 8]
а наоборот?
Все данные у меня есть в формате "12.34". У меня есть 4 средства выбора, в которых я хочу отобразить и отредактировать это (01.23 или 1.23 невозможно). Но спасибо за предупреждение!
Вы имеете в виду, что вам нужен выходной массив из 4 цифр? с [0,0,0,0] на [9,9,9,9]?
Да, ты прав.
Было бы лучше сохранить 4 цифры как целое число (0-9999) и избежать всех проблем с округлением.





Ты можешь попробовать
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"]
@MartinR да, это произойдет, но оператор может дать отзыв, если его двойник будет таким, если да, используйте floor / ceil / round
Это также не работает с научной записью значений с плавающей запятой, попробуйте let amount = Double.greatestFiniteMagnitude
Почему бы не просто compactMap(Int.init)?
@LeoDabus compactMap{Int($0)} имеет меньше символов
А что, если результат должен быть [7, 8, 5, 8]?
@LeoDabus, твоя попытка дает ошибку сигментации
@Sh_Khan: вы имеете в виду: 'let b = "78.58".compactMap{Int($0)}'? Это дает ошибку «Инициализатор init (_: radix:)» требует, чтобы «String.Element» (он же «Character») соответствовал «StringProtocol».
let res = "\(amount)".compactMap { Int("\($0)") }Понятно. Прекрасно работает!
Да, забыл, что у Int нет инициализатора символов. Обратите внимание, что для Свифт 5 или новее вы можете использовать свойство CharacterwholeNumberValue. Нет необходимости преобразовывать символ в строку. compactMap{$0.wholeNumberValue}
Вы также можете просто использовать метод описания для 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, который предлагают другие.
Какова цель конверсии? Знаете ли вы, что большинство десятичных дробей не представляются в точности как двоичные числа с плавающей запятой? Попробуйте
let amount = 0.3 - 0.2; print(amount).