Skip to content

Commit 707896f

Browse files
authored
Merge pull request #1644 from spevans/pr_sr_1674
2 parents 8848f6e + acb8cf7 commit 707896f

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

Foundation/Scanner.swift

+29-1
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ extension String {
337337
buf.advance()
338338
buf.skip(skipSet)
339339
}
340-
if (!isADigit(buf.currentCharacter)) {
340+
if (buf.currentCharacter != ds && !isADigit(buf.currentCharacter)) {
341341
return false
342342
}
343343

@@ -377,6 +377,34 @@ extension String {
377377
buf.advance()
378378
} while (isADigit(buf.currentCharacter))
379379
}
380+
381+
if buf.currentCharacter == unichar(unicodeScalarLiteral: "e") || buf.currentCharacter == unichar(unicodeScalarLiteral: "E") {
382+
var exponent = Double(0)
383+
var negExponent = false
384+
buf.advance()
385+
if buf.currentCharacter == unichar(unicodeScalarLiteral: "-") || buf.currentCharacter == unichar(unicodeScalarLiteral: "+") {
386+
negExponent = buf.currentCharacter == unichar(unicodeScalarLiteral: "-")
387+
buf.advance()
388+
}
389+
repeat {
390+
let numeral = numericValue(buf.currentCharacter)
391+
buf.advance()
392+
if numeral == -1 {
393+
break
394+
}
395+
exponent *= 10
396+
exponent += Double(numeral)
397+
} while (isADigit(buf.currentCharacter))
398+
399+
if exponent > 0 {
400+
let multiplier = pow(10, exponent)
401+
if negExponent {
402+
localResult /= T(multiplier)
403+
} else {
404+
localResult *= T(multiplier)
405+
}
406+
}
407+
}
380408

381409
to(neg ? T(-1) * localResult : localResult)
382410
locationToScanFrom = buf.location

TestFoundation/TestNSString.swift

+23
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class TestNSString: LoopbackServerTest {
3535
("test_BridgeConstruction", test_BridgeConstruction ),
3636
("test_integerValue", test_integerValue ),
3737
("test_intValue", test_intValue ),
38+
("test_doubleValue", test_doubleValue),
3839
("test_isEqualToStringWithSwiftString", test_isEqualToStringWithSwiftString ),
3940
("test_isEqualToObjectWithNSString", test_isEqualToObjectWithNSString ),
4041
("test_isNotEqualToObjectWithNSNumber", test_isNotEqualToObjectWithNSNumber ),
@@ -186,6 +187,28 @@ class TestNSString: LoopbackServerTest {
186187
let string10: NSString = "-999999999999999999999999999999"
187188
XCTAssertEqual(string10.intValue, Int32.min)
188189
}
190+
191+
func test_doubleValue() {
192+
XCTAssertEqual(NSString(".2").doubleValue, 0.2)
193+
XCTAssertEqual(NSString("+.2").doubleValue, 0.2)
194+
XCTAssertEqual(NSString("-.2").doubleValue, -0.2)
195+
XCTAssertEqual(NSString("1.23015e+3").doubleValue, 1230.15)
196+
XCTAssertEqual(NSString("12.3015e+02").doubleValue, 1230.15)
197+
XCTAssertEqual(NSString("+1.23015e+3").doubleValue, 1230.15)
198+
XCTAssertEqual(NSString("+12.3015e+02").doubleValue, 1230.15)
199+
XCTAssertEqual(NSString("-1.23015e+3").doubleValue, -1230.15)
200+
XCTAssertEqual(NSString("-12.3015e+02").doubleValue, -1230.15)
201+
XCTAssertEqual(NSString("-12.3015e02").doubleValue, -1230.15)
202+
XCTAssertEqual(NSString("-31.25e-04").doubleValue, -0.003125)
203+
204+
XCTAssertEqual(NSString(".e12").doubleValue, 0)
205+
XCTAssertEqual(NSString("2e3.12").doubleValue, 2000)
206+
XCTAssertEqual(NSString("1e2.3").doubleValue, 100)
207+
XCTAssertEqual(NSString("12.e4").doubleValue, 120000)
208+
XCTAssertEqual(NSString("1.2.3.4").doubleValue, 1.2)
209+
XCTAssertEqual(NSString("1e2.3").doubleValue, 100)
210+
XCTAssertEqual(NSString("1E3").doubleValue, 1000)
211+
}
189212

190213
func test_isEqualToStringWithSwiftString() {
191214
let string: NSString = "literal"

0 commit comments

Comments
 (0)