user3535074
user3535074

Reputation: 1338

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?

Upvotes: 13

Views: 12856

Answers (4)

Paula Hasstenteufel
Paula Hasstenteufel

Reputation: 720

There is a simple solution I learned with "We <3 Swift", which is so easy you can even use without Foundation, round() or Strings, keeping the numeric value.

Example:

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

result: 31.726

Upvotes: 0

RM34545
RM34545

Reputation: 121

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"

Upvotes: 7

CommaToast
CommaToast

Reputation: 12178

You can still use good ole NSLog("%.2f",myFloatOrDouble) too :D

Upvotes: 0

Antonio
Antonio

Reputation: 72750

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])

Upvotes: 17

Related Questions