diff --git a/Sources/Percentage/Percentage.swift b/Sources/Percentage/Percentage.swift index c80a8a3..89e2405 100644 --- a/Sources/Percentage/Percentage.swift +++ b/Sources/Percentage/Percentage.swift @@ -62,6 +62,30 @@ public struct Percentage: Hashable, Codable { */ public var fraction: Double { rawValue / 100 } + /** + Clamp the percentage to a value between 0% and 100%. + + ``` + 110%.clampedZeroToHundred + //=> 100% + + -1%.clampedZeroToHundred + //=> 0% + + 60%.clampedZeroToHundred + //=> 60% + ``` + */ + public var clampedZeroToHundred: Self { + if rawValue > 100 { + return 100% + } else if rawValue < 0 { + return 0% + } else { + return self + } + } + /** Create a `Percentage` from a `BinaryFloatingPoint`, for example, `Double` or `CGFloat`. diff --git a/Tests/PercentageTests/PercentageTests.swift b/Tests/PercentageTests/PercentageTests.swift index 5855176..5bf468c 100644 --- a/Tests/PercentageTests/PercentageTests.swift +++ b/Tests/PercentageTests/PercentageTests.swift @@ -32,6 +32,12 @@ final class PercentageTests: XCTestCase { XCTAssertTrue(30% > 25%) } + func testClampedZeroToHundred() { + XCTAssertEqual(101%.clampedZeroToHundred, 100%) + XCTAssertEqual((-1%).clampedZeroToHundred, 0%) + XCTAssertEqual(40%.clampedZeroToHundred, 40%) + } + func testPercentageOf() { XCTAssertEqual(50%.of(200), 100) XCTAssertEqual(50%.of(201), 100) diff --git a/readme.md b/readme.md index d8416a2..b78cdf6 100644 --- a/readme.md +++ b/readme.md @@ -56,6 +56,9 @@ Percentage(fraction: 0.5) 10%.rawValue //=> 10 +110%.clampedZeroToHundred +//=> 100% + print("\(1%)") //=> "1%"