Last active
March 13, 2018 10:45
NumberFormatter+Currency.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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