Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift number formatting

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?

like image 997
user3535074 Avatar asked Oct 02 '14 18:10

user3535074


2 Answers

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])
like image 158
Antonio Avatar answered Oct 30 '22 11:10

Antonio


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"
like image 26
RM34545 Avatar answered Oct 30 '22 12:10

RM34545