Skip to content

Commit 641e2cb

Browse files
committed
NSDecimalNumber: Add missing init(value:) initialisers.
- Fix init(mantissa:exponent:isNegative:) to set the mantissa correctly.
1 parent b465691 commit 641e2cb

File tree

2 files changed

+98
-13
lines changed

2 files changed

+98
-13
lines changed

Foundation/NSDecimalNumber.swift

+70-13
Original file line numberDiff line numberDiff line change
@@ -79,29 +79,21 @@ open class NSDecimalNumber : NSNumber {
7979

8080
fileprivate let decimal: Decimal
8181
public convenience init(mantissa: UInt64, exponent: Int16, isNegative: Bool) {
82-
var d = Decimal()
83-
d._exponent = Int32(exponent)
82+
var d = Decimal(mantissa)
83+
d._exponent += Int32(exponent)
8484
d._isNegative = isNegative ? 1 : 0
85-
var man = mantissa
86-
d._mantissa.0 = UInt16(man & 0xffff)
87-
man >>= 4
88-
d._mantissa.1 = UInt16(man & 0xffff)
89-
man >>= 4
90-
d._mantissa.2 = UInt16(man & 0xffff)
91-
man >>= 4
92-
d._mantissa.3 = UInt16(man & 0xffff)
93-
d._length = 4
94-
d.trimTrailingZeros()
95-
// TODO more parts of the mantissa...
9685
self.init(decimal: d)
9786
}
87+
9888
public init(decimal dcm: Decimal) {
9989
self.decimal = dcm
10090
super.init()
10191
}
92+
10293
public convenience init(string numberValue: String?) {
10394
self.init(decimal: Decimal(string: numberValue ?? "") ?? Decimal.nan)
10495
}
96+
10597
public convenience init(string numberValue: String?, locale: Any?) {
10698
self.init(decimal: Decimal(string: numberValue ?? "", locale: locale as? Locale) ?? Decimal.nan)
10799
}
@@ -136,6 +128,71 @@ open class NSDecimalNumber : NSNumber {
136128
super.init()
137129
}
138130

131+
public init(value: Int) {
132+
decimal = Decimal(value)
133+
super.init()
134+
}
135+
136+
public init(value: UInt) {
137+
decimal = Decimal(value)
138+
super.init()
139+
}
140+
141+
public init(value: Int8) {
142+
decimal = Decimal(value)
143+
super.init()
144+
}
145+
146+
public init(value: UInt8) {
147+
decimal = Decimal(value)
148+
super.init()
149+
}
150+
151+
public init(value: Int16) {
152+
decimal = Decimal(value)
153+
super.init()
154+
}
155+
156+
public init(value: UInt16) {
157+
decimal = Decimal(value)
158+
super.init()
159+
}
160+
161+
public init(value: Int32) {
162+
decimal = Decimal(value)
163+
super.init()
164+
}
165+
166+
public init(value: UInt32) {
167+
decimal = Decimal(value)
168+
super.init()
169+
}
170+
171+
public init(value: Int64) {
172+
decimal = Decimal(value)
173+
super.init()
174+
}
175+
176+
public init(value: UInt64) {
177+
decimal = Decimal(value)
178+
super.init()
179+
}
180+
181+
public init(value: Bool) {
182+
decimal = Decimal(value ? 1 : 0)
183+
super.init()
184+
}
185+
186+
public init(value: Float) {
187+
decimal = Decimal(Double(value))
188+
super.init()
189+
}
190+
191+
public init(value: Double) {
192+
decimal = Decimal(value)
193+
super.init()
194+
}
195+
139196
public required convenience init(floatLiteral value: Double) {
140197
self.init(decimal:Decimal(value))
141198
}

TestFoundation/TestDecimal.swift

+28
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class TestDecimal: XCTestCase {
1111

1212
static var allTests : [(String, (TestDecimal) -> () throws -> Void)] {
1313
return [
14+
("test_NSDecimalNumberInit", test_NSDecimalNumberInit),
1415
("test_AdditionWithNormalization", test_AdditionWithNormalization),
1516
("test_BasicConstruction", test_BasicConstruction),
1617
("test_Constants", test_Constants),
@@ -33,6 +34,33 @@ class TestDecimal: XCTestCase {
3334
]
3435
}
3536

37+
func test_NSDecimalNumberInit() {
38+
XCTAssertEqual(NSDecimalNumber(mantissa: 123456789000, exponent: -2, isNegative: true), -1234567890)
39+
XCTAssertEqual(NSDecimalNumber(decimal: Decimal()).decimalValue, Decimal(0))
40+
XCTAssertEqual(NSDecimalNumber(decimal: Decimal(1)).intValue, 1)
41+
XCTAssertEqual(NSDecimalNumber(string: "1.234").floatValue, 1.234)
42+
XCTAssertTrue(NSDecimalNumber(string: "invalid").decimalValue.isNaN)
43+
XCTAssertEqual(NSDecimalNumber(value: true).boolValue, true)
44+
XCTAssertEqual(NSDecimalNumber(value: false).boolValue, false)
45+
XCTAssertEqual(NSDecimalNumber(value: Int.min).intValue, Int.min)
46+
XCTAssertEqual(NSDecimalNumber(value: UInt.min).uintValue, UInt.min)
47+
XCTAssertEqual(NSDecimalNumber(value: Int8.min).int8Value, Int8.min)
48+
XCTAssertEqual(NSDecimalNumber(value: UInt8.min).uint8Value, UInt8.min)
49+
XCTAssertEqual(NSDecimalNumber(value: Int16.min).int16Value, Int16.min)
50+
XCTAssertEqual(NSDecimalNumber(value: UInt16.min).uint16Value, UInt16.min)
51+
XCTAssertEqual(NSDecimalNumber(value: Int32.min).int32Value, Int32.min)
52+
XCTAssertEqual(NSDecimalNumber(value: UInt32.min).uint32Value, UInt32.min)
53+
XCTAssertEqual(NSDecimalNumber(value: Int64.min).int64Value, Int64.min)
54+
XCTAssertEqual(NSDecimalNumber(value: UInt64.min).uint64Value, UInt64.min)
55+
XCTAssertEqual(NSDecimalNumber(value: Float.leastNormalMagnitude).floatValue, Float.leastNormalMagnitude)
56+
XCTAssertEqual(NSDecimalNumber(value: Float.greatestFiniteMagnitude).floatValue, Float.greatestFiniteMagnitude)
57+
XCTAssertEqual(NSDecimalNumber(value: Double.pi).doubleValue, Double.pi)
58+
XCTAssertEqual(NSDecimalNumber(integerLiteral: 0).intValue, 0)
59+
XCTAssertEqual(NSDecimalNumber(floatLiteral: Double.pi).doubleValue, Double.pi)
60+
XCTAssertEqual(NSDecimalNumber(booleanLiteral: true).boolValue, true)
61+
XCTAssertEqual(NSDecimalNumber(booleanLiteral: false).boolValue, false)
62+
}
63+
3664
func test_AdditionWithNormalization() {
3765

3866
let biggie = Decimal(65536)

0 commit comments

Comments
 (0)