Skip to content

Instantly share code, notes, and snippets.

@jaderfeijo
Last active March 13, 2018 10:45
Show Gist options
  • Save jaderfeijo/ac46840d0f268b1670d9e6a1459a578a to your computer and use it in GitHub Desktop.
Save jaderfeijo/ac46840d0f268b1670d9e6a1459a578a to your computer and use it in GitHub Desktop.
NumberFormatter+Currency.swift
//
// NumberFormatter+Currency.swift
// Created by: Jader Feijo
//
import Foundation
extension NumberFormatter {
public static func formatter(forCurrencyCode currencyCode: String) -> NumberFormatter {
return NumberFormatter().with { f in
f.numberStyle = .currency
f.currencyCode = currencyCode
}
}
}
extension String {
public static func price(_ price: Double, currencyCode: String) -> String? {
return NumberFormatter.formatter(
forCurrencyCode: currencyCode
).string(
from: NSNumber(value: price)
)
}
public func price(_ price: Double) -> String? {
return String.price(price, currencyCode: self)
}
}
extension Double {
public func formattedAs(currencyWithCode currencyCode: String) -> String? {
return currencyCode.price(self)
}
}
//
// NumberFormatterCurrencyTests.swift
// Created by: Jader Feijo
//
import XCTest
class NumberFormatterCurrencyTests: XCTestCase {
func testNumberFormatter() {
// British Pounds
let gbp = NumberFormatter.formatter(forCurrencyCode: "GBP")
XCTAssertEqual(gbp.string(from: NSNumber(value: 0.0)), formatted(amount: 0.0, currency: "GBP"))
XCTAssertEqual(gbp.string(from: NSNumber(value: 1.0)), formatted(amount: 1.0, currency: "GBP"))
XCTAssertEqual(gbp.string(from: NSNumber(value: 10.0)), formatted(amount: 10.0, currency: "GBP"))
XCTAssertEqual(gbp.string(from: NSNumber(value: 10.5)), formatted(amount: 10.5, currency: "GBP"))
XCTAssertEqual(gbp.string(from: NSNumber(value: 0.55)), formatted(amount: 0.55, currency: "GBP"))
XCTAssertEqual(gbp.string(from: NSNumber(value: 0.777)), formatted(amount: 0.777, currency: "GBP"))
XCTAssertEqual(gbp.string(from: NSNumber(value: 0.774)), formatted(amount: 0.774, currency: "GBP"))
// US Dollars
let usd = NumberFormatter.formatter(forCurrencyCode: "USD")
XCTAssertEqual(usd.string(from: NSNumber(value: 0.0)), formatted(amount: 0.0, currency: "USD"))
XCTAssertEqual(usd.string(from: NSNumber(value: 1.0)), formatted(amount: 1.0, currency: "USD"))
XCTAssertEqual(usd.string(from: NSNumber(value: 10.0)), formatted(amount: 10.0, currency: "USD"))
XCTAssertEqual(usd.string(from: NSNumber(value: 10.5)), formatted(amount: 10.5, currency: "USD"))
XCTAssertEqual(usd.string(from: NSNumber(value: 0.55)), formatted(amount: 0.55, currency: "USD"))
XCTAssertEqual(usd.string(from: NSNumber(value: 0.777)), formatted(amount: 0.777, currency: "USD"))
XCTAssertEqual(usd.string(from: NSNumber(value: 0.774)), formatted(amount: 0.774, currency: "USD"))
}
func testPriceStatic() {
// British Pounds
XCTAssertEqual(String.price(0.0, currencyCode: "gbp"), formatted(amount: 0.0, currency: "GBP"))
XCTAssertEqual(String.price(1.0, currencyCode: "gbp"), formatted(amount: 1.0, currency: "GBP"))
XCTAssertEqual(String.price(10.0, currencyCode: "gbp"), formatted(amount: 10.0, currency: "GBP"))
XCTAssertEqual(String.price(10.5, currencyCode: "gbp"), formatted(amount: 10.5, currency: "GBP"))
XCTAssertEqual(String.price(0.55, currencyCode: "gbp"), formatted(amount: 0.55, currency: "GBP"))
XCTAssertEqual(String.price(0.777, currencyCode: "gbp"), formatted(amount: 0.777, currency: "GBP"))
XCTAssertEqual(String.price(0.774, currencyCode: "gbp"), formatted(amount: 0.774, currency: "GBP"))
// US Dollars
XCTAssertEqual(String.price(0.0, currencyCode: "usd"), formatted(amount: 0.0, currency: "USD"))
XCTAssertEqual(String.price(1.0, currencyCode: "usd"), formatted(amount: 1.0, currency: "USD"))
XCTAssertEqual(String.price(10.0, currencyCode: "usd"), formatted(amount: 10.0, currency: "USD"))
XCTAssertEqual(String.price(10.5, currencyCode: "usd"), formatted(amount: 10.5, currency: "USD"))
XCTAssertEqual(String.price(0.55, currencyCode: "usd"), formatted(amount: 0.55, currency: "USD"))
XCTAssertEqual(String.price(0.777, currencyCode: "usd"), formatted(amount: 0.777, currency: "USD"))
XCTAssertEqual(String.price(0.774, currencyCode: "usd"), formatted(amount: 0.774, currency: "USD"))
}
func testPriceInstance() {
// British Pounds
XCTAssertEqual("GBP".price(0.0), formatted(amount: 0.0, currency: "GBP"))
XCTAssertEqual("GBP".price(1.0), formatted(amount: 1.0, currency: "GBP"))
XCTAssertEqual("GBP".price(10.0), formatted(amount: 10.0, currency: "GBP"))
XCTAssertEqual("GBP".price(10.5), formatted(amount: 10.5, currency: "GBP"))
XCTAssertEqual("GBP".price(0.55), formatted(amount: 0.55, currency: "GBP"))
XCTAssertEqual("GBP".price(0.777), formatted(amount: 0.777, currency: "GBP"))
XCTAssertEqual("GBP".price(0.774), formatted(amount: 0.774, currency: "GBP"))
// US Dollars
XCTAssertEqual("USD".price(0.0), formatted(amount: 0.0, currency: "USD"))
XCTAssertEqual("USD".price(1.0), formatted(amount: 1.0, currency: "USD"))
XCTAssertEqual("USD".price(10.0), formatted(amount: 10.0, currency: "USD"))
XCTAssertEqual("USD".price(10.5), formatted(amount: 10.5, currency: "USD"))
XCTAssertEqual("USD".price(0.55), formatted(amount: 0.55, currency: "USD"))
XCTAssertEqual("USD".price(0.777), formatted(amount: 0.777, currency: "USD"))
XCTAssertEqual("USD".price(0.774), formatted(amount: 0.774, currency: "USD"))
}
func testFormattedAs() {
// British Pounds
XCTAssertEqual(0.0.formattedAs(currencyWithCode: "GBP"), formatted(amount: 0.0, currency: "GBP"))
XCTAssertEqual(1.0.formattedAs(currencyWithCode: "GBP"), formatted(amount: 1.0, currency: "GBP"))
XCTAssertEqual(10.0.formattedAs(currencyWithCode: "GBP"), formatted(amount: 10.0, currency: "GBP"))
XCTAssertEqual(10.5.formattedAs(currencyWithCode: "GBP"), formatted(amount: 10.5, currency: "GBP"))
XCTAssertEqual(0.55.formattedAs(currencyWithCode: "GBP"), formatted(amount: 0.55, currency: "GBP"))
XCTAssertEqual(0.777.formattedAs(currencyWithCode: "GBP"), formatted(amount: 0.78, currency: "GBP"))
XCTAssertEqual(0.774.formattedAs(currencyWithCode: "GBP"), formatted(amount: 0.77, currency: "GBP"))
// US Dollars
XCTAssertEqual(0.0.formattedAs(currencyWithCode: "USD"), formatted(amount: 0.0, currency: "USD"))
XCTAssertEqual(1.0.formattedAs(currencyWithCode: "USD"), formatted(amount: 1.0, currency: "USD"))
XCTAssertEqual(10.0.formattedAs(currencyWithCode: "USD"), formatted(amount: 10.0, currency: "USD"))
XCTAssertEqual(10.5.formattedAs(currencyWithCode: "USD"), formatted(amount: 10.5, currency: "USD"))
XCTAssertEqual(0.55.formattedAs(currencyWithCode: "USD"), formatted(amount: 0.55, currency: "USD"))
XCTAssertEqual(0.777.formattedAs(currencyWithCode: "USD"), formatted(amount: 0.78, currency: "USD"))
XCTAssertEqual(0.774.formattedAs(currencyWithCode: "USD"), formatted(amount: 0.77, currency: "USD"))
}
func formatted(amount: Double, currency: String) -> String? {
let formatter = NumberFormatter().with { f in
f.numberStyle = .currency
f.currencyCode = currency
}
return formatter.string(from: NSNumber(value: amount))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment