0

I need to create a function to add the decimal and thousands separators to a number that is a string, I know I could use numberFormatter but I want to practice another way of doing it. For example if I have "454685" the result will be "$ 4,546.85". This is my code:

let number = "111234567" 

let firstIndex = number.startIndex
let firstNumber = number[firstIndex]

let lastIndex = number.index(before: number.endIndex)
let lastNumber = String(number[lastIndex])

let beforeLastIndex = number.index(number.endIndex, offsetBy: -2)
let beforeLastNumber = String(number[beforeLastIndex])

var decimalPart = beforeLastNumber + lastNumber
let decimalindex = number.index(number.endIndex, offsetBy: -2)

let intPart = String(number[..<decimalindex])

let totalNumber = "$" + intPart + "," + decimalPart
print(totalNumber)

var thousandSeparators = intPart.count % 3 == 1

I'm stuck here, I separated the decimal part from the integer part, but then I don't know how to add the thousand separator "." to string number.

akitainu22
  • 95
  • 1
  • 8

1 Answers1

0

You can achieve this by creating a function for a string that split the string as per the length passes in parameter and the direction for splitting.

extension String {

    func split(length:Int, fromBack: Bool = false) -> [Substring] {
        guard length > 0 && length < count else { return [suffix(from:startIndex)] }
        if fromBack {
            return (0 ... (count - 1) / length).map { dropLast($0 * length).suffix(length) }.reversed()
        }
        return (0 ... (count - 1) / length).map { dropFirst($0 * length).prefix(length) }
    }
    
}

how to use this function:

let number = "111234567"

let firstIndex = number.startIndex
let firstNumber = number[firstIndex]

let lastIndex = number.index(before: number.endIndex)
let lastNumber = String(number[lastIndex])

let beforeLastIndex = number.index(number.endIndex, offsetBy: -2)
let beforeLastNumber = String(number[beforeLastIndex])

var decimalPart = beforeLastNumber + lastNumber
let decimalindex = number.index(number.endIndex, offsetBy: -2)

let intPart = String(number[..<decimalindex])

let intWithThousandSeparators = intPart.split(length: 3, fromBack: true).joined(separator: ".")

let totalNumber = "$" + intWithThousandSeparators + "," + decimalPart
print(totalNumber)

Output:

enter image description here

You can refer to this answers list for split strings into groups.

Darshan
  • 431
  • 4
  • 12