строка в целое не дает ожидаемого результата

Вопрос или проблема

print("int==1.0--\(Int("1.0") ?? 0)")
print("int==1--\(Int("1") ?? 0)")

Полученный мной вывод

int==1.0--0
int==1--1

Ожидаемый вывод

int==1.0--1
int==1--1

Есть идеи, почему в первой строке вывод не равен 1

Примечание :

print("int==1--\(Int(1.0) )")

Это дает вывод 1.

Причина в том, что “1.0” не является допустимым строковым представлением целого числа, поэтому Int(“1.0”) не возвращает целочисленное значение, и именно поэтому вы получили 0 вместо 1.

Я предоставляю исправленный код.

if let floatVal = Double("1.0") {
    print("int==1.0--\(Int(floatVal))")
} else {
    print("int==1.0--0")
}
print("int==1--\(Int("1") ?? 0)")

Надеюсь, это поможет вам.

Решение в одну строку:

print("int==1.0--\(Int(Float("1.0") ?? 0.0))")
print("int==1--\(Int("1") ?? 0)")

Инициализатор, который вы вызываете, используя строковый аргумент, описан здесь и имеет следующие требования к входным данным

Строка, переданная в качестве описания, может начинаться с символа плюс или минус (+ или -), за которым следуют одна или несколько цифр (0-9).

Поскольку ваша строка также содержит точку, это нарушает правило, и инициализация не удается, возвращая nil.

Что касается другого инициализатора, принимающего Double, документация утверждает, что

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

Поэтому это правильно вернет 1.

Ответ или решение

Причина, по которой строка "1.0" не преобразуется в целое число в вашем коде, связана с тем, что инициализатор Int не принимает строку с десятичной частью, как вы и заметили. Метод Int(_: String) требует, чтобы строка представляла собой валидное целое число, и строка "1.0" не удовлетворяет этому требованию. В результате попытка вызвать Int("1.0") возвращает nil, и ваш код получает значение 0 из-за оператора nil-coalescing (??).

Для решения этой проблемы вы можете сначала преобразовать строку "1.0" в число с плавающей запятой (Double), а затем преобразовать его в целое число. Вот корректированный код:

if let floatVal = Double("1.0") {
    print("int==1.0--\(Int(floatVal))") // Это станет "int==1.0--1"
} else {
    print("int==1.0--0")
}
print("int==1--\(Int("1") ?? 0)") // Это станет "int==1--1"

В этом примере мы сначала проверяем, может ли строка "1.0" быть преобразована в Double. Если это удается, мы затем преобразуем полученное значение в Int, что и дает вам желаемый результат 1.

Альтернативно, если вы хотите использовать более компактный одинарный вызов, вы можете сделать так:

print("int==1.0--\(Int(Double("1.0") ?? 0.0))")
print("int==1--\(Int("1") ?? 0)")

В этом коде мы используем Double для обработки строки "1.0", чтобы преобразовать её в Int. Этот подход также приводит к ожидаемому результату.

Важно отметить, что инициализатор Int(_: String) применяется только к строкам, которые представляют собой целые числа (например, "1", "-2"). Строки с десятичной точкой, такие как "1.0", не соответствуют этому критерию, что приводит к неудаче и возврату nil.

Дополнительно, как уже упоминалось, документация Apple подтверждает, что строка, переданная в инициализатор, может начинаться со знака "плюс" или "минус", за которым следуют одна или несколько цифр (0-9). Это объясняет, почему "1.0" не может быть проинициализировано как Int.

Таким образом, для получения желаемого поведения в вашем коде необходимо выполнять промежуточное преобразование через тип Double, прежде чем выполнять преобразование в тип Int.

Оцените материал
Добавить комментарий

Капча загружается...