вторник, 23 августа 2016 г.


Округление чисел в Swift.

Разработчикам частенько приходится выводить числовые результаты с нужной точностью и форматированием (деньги, мили-километры…). Swift предлагает нам несколько вариантов округления чисел через встроенные функции, а также специальное форматирование с использованием String и спецификаторов.

Попробуем округлить различные типы данных до нужной нам точности.
  • Встроенные функции round, floor, ceil
round(1.3) // 1 
round(1.5) // 2
round(-1.3) // -1
round(-1.5) // -2

floor(1.3) // 1
floor(1.5) // 1
floor(-1.3) // -2
floor(-1.5) // -2


ceil(1.3) // 2
ceil(1.5) // 2
ceil(-1.3) // -1
ceil(-1.5) // -1


  • Использование String и спецификаторов String(format: "specificators", argument).
Общий формат specificators немного замысловат и не совсем ясен с первого взгляда.

%[флаги][ширина][.точность][размер]тип

Подробности здесь, а нас интересует как это можно использовать для округления:
String(format: "%.3f", 1.34567) // 1.346
String(format: "%.2f", 1.34567) // 1.35 
String(format: "%.1f", 1.34567) // 1.3
String(format: "%.0f", 1.34567) // 1

.3, .2, .1, .0 обозначает точность знаков после запятой
f означает входной тип - Float.


Числа удобно дополнять, например нулями:

String(format: "04d", 10) // 0010
String(format: "The current time is %02d:%02d", 3, 15) // "The current time is 03:15"
“0004d” обозначает дополнить число до длины 4 нулями слева.



Наивная реализация для форматирования времени:

func toTime(hours:UInt, minutes:UInt, seconds:UInt, milliseconds:UInt)-> String{
    return String(format: "%02d:%02d:%02d-%02d", hours, minutes, seconds, milliseconds)
}

toTime(hours: 10, minutes: 59, seconds: 3, milliseconds: 5) // 10:59:03-05


  • Ссылки
Wikipedia
http://www.globalnerdy.com/2016/01/26/better-to-be-roughly-right-than-precisely-wrong-rounding-numbers-with-swift/