2014-10-02 3 views
8

Я только начинаю знакомство с Swift, но у меня серьезная проблема с форматированием чисел на чрезвычайно базовом уровне.Быстрое форматирование чисел

Например, мне нужно отобразить целое число с не менее чем двумя цифрами (например, 00, 01, 02, 03, 04, 05 ...). Обычный синтаксис, который я ожидал бы, будет примерно таким:

println ("% 02i% 02i% 02i", var1, var2, var3);

... но я не нахожу четких инструкций о том, как достичь этого в Swift. Мне очень трудно поверить, что мне нужно создать пользовательскую функцию для этого. То же самое для возврата плавающего или двойного значения в фиксированное число десятичных знаков.

Я нашел ссылки на пару подобных вопросов (Precision String Format Specifier In Swift & How to use println in Swift to format number), но они, кажется, смешать Objective C и даже говорить о Python и с использованием библиотек единства. Нет ли решения Swift для этого базового программирования? Действительно ли это так, что в Swift полностью игнорируется что-то настолько фундаментальное?

ответ

11

Вы можете построить строку с с-как форматирование с помощью этого конструктора:

String(format: String, arguments:[CVarArgType]) 

Пример использования:

var x = 10 

println(String(format: "%04d", arguments: [x])) // This will print "0010" 

Если вы собираетесь использовать его много, и хотите более компактную форму можно реализовать следующим образом:

extension String { 
    func format(arguments: [CVarArgType]) -> String { 
     return String(format: self, arguments: arguments) 
    } 
} 

, что позволяет упростить его использование как в этот пример:

"%d apples cost $%03.2f".format([4, 4 * 0.33]) 
+4

Или просто 'Println (String (формат: "% 04d", х))' ... –

+1

Спасибо @MartinR, что гораздо лучше :) - добавлена ​​еще более короткая форма с использованием расширения. – Antonio

+1

Большое спасибо вам обоим. После прочтения страниц и страниц обсуждения вокруг этого, очень важно иметь четкое, сжатое решение. – user3535074

0

Вы можете использовать хороший оле NSLog ("% 2f", myFloatOrDouble) тоже: D

1

Вот POP решение проблемы:

protocol Formattable { 
    func format(pattern: String) -> String 
} 
extension Formattable where Self: CVarArg { 
    func format(pattern: String) -> String { 
     return String(format: pattern, arguments: [self]) 
    } 
} 
extension Int: Formattable { } 
extension Double: Formattable { } 
extension Float: Formattable { } 

let myInt = 10 
let myDouble: Double = 0.01 
let myFloat: Float = 1.11 

print(myInt.format(pattern: "%04d"))  // "0010 
print(myDouble.format(pattern: "%.2f")) // "0.01" 
print(myFloat.format(pattern: "$%03.2f")) // "$1.11" 
print(100.format(pattern: "%05d"))  // "00100" 
1

Eсть простое решение, которое я узнал в «We < 3 Swift», которое так легко вы можете использовать без Foundation, round() или Strings, сохраняя числовое значение.

Пример:

var number = 31.726354765 
var intNumber = Int(number * 1000.0) 
var roundedNumber = Double(intNumber)/1000.0 

Результат: 31,726