Skip to content

Commit d82ac66

Browse files
authored
MOB-386 Fix Subaccount transfer for France (#121)
* Add logging * Fix formatting issue when locale is set to France * Updated formatter and add UTs * Revert rounded * Address review comment * Clean up * Cleanup * Cleanup * Fix typo * Fix typo and lint
1 parent 24fa6db commit d82ac66

File tree

3 files changed

+76
-9
lines changed

3 files changed

+76
-9
lines changed

dydx/dydxFormatter/dydxFormatter/dydxFormatter.swift

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,12 @@ public final class dydxFormatter: NSObject, SingletonProtocol {
369369
/*
370370
xxxxxx,yyyyy or xxxxx.yyyyy
371371
*/
372-
public func raw(number: NSNumber?, size: String?) -> String? {
372+
public func raw(number: NSNumber?, size: String?, locale: Locale = Locale.current) -> String? {
373373
if let number = number {
374374
let size = size ?? "0.01"
375375
let digits = digits(size: size)
376376
let rounded = rounded(number: number, digits: digits)
377-
return raw(number: rounded, digits: digits)
377+
return raw(number: rounded, digits: digits, locale: locale)
378378
} else {
379379
return nil
380380
}
@@ -383,21 +383,37 @@ public final class dydxFormatter: NSObject, SingletonProtocol {
383383
/*
384384
xxxxx.yyyyy
385385
*/
386-
public func decimalRaw(number: NSNumber?, size: String?) -> String? {
387-
return raw(number: number, size: size)?.replacingOccurrences(of: ",", with: ".")
386+
public func decimalLocaleAgnostic(number: NSNumber?, size: String?) -> String? {
387+
raw(number: number, size: size, locale: Locale(identifier: "en-US"))
388+
}
389+
390+
/*
391+
xxxxx.yyyyy
392+
*/
393+
public func decimalLocaleAgnostic(number: NSNumber?, digits: Int) -> String? {
394+
raw(number: number, digits: digits, locale: Locale(identifier: "en-US"))
388395
}
389396

390397
/*
391398
xxxxxx,yyyyy or xxxxx.yyyyy
392399
*/
393-
public func raw(number: NSNumber?, digits: Int) -> String? {
400+
public func raw(number: NSNumber?, digits: Int, locale: Locale = Locale.current) -> String? {
394401
if let value = number?.doubleValue {
395402
if value.isFinite {
396403
if let number = number {
404+
rawFormatter.locale = locale
397405
rawFormatter.minimumFractionDigits = max(digits, 0)
398406
rawFormatter.maximumFractionDigits = max(digits, 0)
399407
rawFormatter.roundingMode = .halfUp
400-
return rawFormatter.string(from: number)
408+
409+
let formatted = rawFormatter.string(from: number)
410+
411+
// need to special case for negative 0, see dydxFormatter tests. E.g. "-$0.001" should go to "$0.00"
412+
if let formatted = formatted, rawFormatter.number(from: formatted) == 0 {
413+
return rawFormatter.string(from: 0)
414+
} else {
415+
return formatted
416+
}
401417
} else {
402418
return nil
403419
}

dydx/dydxFormatter/dydxFormatterTests/dydxFormatterTests.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,54 @@ final class dydxFormatterTests: XCTestCase {
1818
// Put teardown code here. This method is called after the invocation of each test method in the class.
1919
}
2020

21+
func testDecimalLocaleAgnostic() {
22+
struct TestCase {
23+
let number: NSNumber
24+
let digits: Int
25+
let expected: String
26+
}
27+
28+
let testCases: [TestCase] = [
29+
.init(number: 1, digits: 2, expected: "1.00"),
30+
.init(number: -0.001, digits: 0, expected: "0"),
31+
.init(number: -0.001, digits: 3, expected: "-0.001"),
32+
.init(number: -0.001, digits: 2, expected: "0.00"),
33+
.init(number: 0.001, digits: 2, expected: "0.00"),
34+
.init(number: -0.005, digits: 2, expected: "-0.01"),
35+
.init(number: -0.0051, digits: 2, expected: "-0.01")
36+
]
37+
38+
for testCase in testCases {
39+
let formatted = dydxFormatter.shared.decimalLocaleAgnostic(number: testCase.number, digits: testCase.digits)
40+
XCTAssertEqual(formatted, testCase.expected, "Test case: \(testCase)")
41+
}
42+
}
43+
44+
func testRaw() {
45+
struct TestCase {
46+
let number: NSNumber
47+
let digits: Int
48+
let expected: String
49+
var locale: Locale = Locale(identifier: "en_US")
50+
}
51+
52+
let testCases: [TestCase] = [
53+
.init(number: 1, digits: 2, expected: "1.00"),
54+
.init(number: -0.001, digits: 0, expected: "0"),
55+
.init(number: -0.001, digits: 3, expected: "-0.001"),
56+
.init(number: -0.001, digits: 2, expected: "0.00"),
57+
.init(number: 0.001, digits: 2, expected: "0.00"),
58+
.init(number: -0.005, digits: 2, expected: "-0.01"),
59+
.init(number: -0.0051, digits: 2, expected: "-0.01"),
60+
.init(number: 1123345.123, digits: 2, expected: "1123345,12", locale: Locale(identifier: "fr_FR"))
61+
]
62+
63+
for testCase in testCases {
64+
let formatted = dydxFormatter.shared.raw(number: testCase.number, digits: testCase.digits, locale: testCase.locale)
65+
XCTAssertEqual(formatted, testCase.expected, "Test case: \(testCase)")
66+
}
67+
}
68+
2169
func testDollarFormatting() throws {
2270
struct TestCase {
2371
let number: Double

dydx/dydxPresenters/dydxPresenters/_v4/GlobalWorkers/Workers/dydxTransferSubaccountWorker.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ final class dydxTransferSubaccountWorker: BaseWorker {
4040
subaccountNumber = 0
4141
}
4242
let depositAmount = (balance ?? 0) - dydxTransferSubaccountWorker.balanceRetainAmount
43-
let amountString = dydxFormatter.shared.raw(number: NSNumber(value: depositAmount),
44-
digits: dydxTokenConstants.usdcTokenDecimal)
43+
let amountString = dydxFormatter.shared.decimalLocaleAgnostic(number: NSNumber(value: depositAmount),
44+
digits: dydxTokenConstants.usdcTokenDecimal)
4545
if let amountString = amountString {
4646
self?.depositToSubaccount(amount: amountString,
4747
subaccount: subaccountNumber,
@@ -55,7 +55,7 @@ final class dydxTransferSubaccountWorker: BaseWorker {
5555

5656
private func depositToSubaccount(amount: String, subaccount: Int, walletState: dydxWalletState) {
5757
CosmoJavascript.shared.depositToSubaccount(subaccount: subaccount, amount: amount) { result in
58-
let trackingData = [
58+
var trackingData = [
5959
"amount": "\(amount)",
6060
"address": "\(String(describing: walletState.currentWallet?.cosmoAddress))"
6161
]
@@ -65,6 +65,9 @@ final class dydxTransferSubaccountWorker: BaseWorker {
6565
Tracking.shared?.log(event: "SubaccountDeposit", data: trackingData)
6666
} else {
6767
Console.shared.log("Deposit to subaccount failed")
68+
if let resultString = result as? String {
69+
trackingData["error"] = resultString
70+
}
6871
Tracking.shared?.log(event: "SubaccountDeposit_Failed", data: trackingData)
6972
}
7073
}

0 commit comments

Comments
 (0)