Swift number formatting

10,924

Solution 1

You can construct a string with a c-like formatting using this constructor:

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

Sample usage:

var x = 10

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

If you're going to use it a lot, and want a more compact form, you can implement an extension like this:

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

allowing to simplify its usage as in this example:

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

Solution 2

Here's a POP solution to the problem:

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"
Share:
10,924

Related videos on Youtube

user3535074
Author by

user3535074

Updated on September 14, 2022

Comments

  • user3535074
    user3535074 over 1 year

    I am just starting to get to know Swift but I am having a serious problem with number formatting at an extremely basic level.

    For example, I need to display an integer with at least 2 digits (e.g. 00, 01, 02, 03, 04, 05 ...). The normal syntax I'd expect would be something like:

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

    ...but I don't find any clear instruction for how to achieve this in Swift. I find it really hard to believe that I need to create a custom function to do that. The same for returning a float or double value to a fixed number of decimal places.

    I've found links to a couple of similar questions (Precision String Format Specifier In Swift & How to use println in Swift to format number) but they seem to mix objective C and even talk about Python and using unity libraries. Is there no Swift solution to this basic programming need? Is it really true that something so fundamental has been completely overlooked in Swift?