Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //split string to two part
- func splitNumber(_ str: String) -> (String, String){
- let arr = Array(str)
- if let indexDot = arr.firstIndex(of: "."){
- return (String(arr[0 ..< indexDot]), String(arr[indexDot + 1 ..< str.count]))
- }
- return (str, "")
- }
- //add two valid double string
- func addDoubleString(_ str1: String, _ str2: String) -> String{
- let pair1 = splitNumber(str1)
- let pair2 = splitNumber(str2)
- let decimalResult = addDecimal(pair1.1, pair2.1)
- return addInteger(pair1.0, pair2.0, decimalResult.1) + decimalResult.0
- }
- //this function add two decimal string and return the int carry over part
- func addDecimal(_ str1 : String, _ str2: String) -> (String , Int){
- var st1 = str1
- var st2 = str2
- while st1.count != st2.count{
- if str1.count > str2.count {st2.append("0")}
- if str2.count > str1.count {st1.append("0")}
- }
- let decimalRes = addString(st1, st2, 0)
- return (decimalRes.0.count > 0 ? "." + decimalRes.0 : "", decimalRes.1)
- }
- //this function add two integer with carry
- func addInteger(_ str1 : String, _ str2: String, _ inputCarry :Int) -> String{
- let res = addString(str1, str2, inputCarry)
- return (res.1 > 0 ? String(res.1) : "") + res.0
- }
- //this function add two integer number and return carry
- func addString(_ str1 : String, _ str2: String, _ inputCarry :Int) -> (String , Int){ // res and carry
- let arr1 = Array(str1)
- let arr2 = Array(str2)
- var p1 = arr1.count - 1
- var p2 = arr2.count - 1
- var res = ""
- var carry = inputCarry
- while p1 >= 0 || p2 >= 0 {
- let int1 = (p1 >= 0 ? Int(String(arr1[p1]))! : 0 )
- let int2 = (p2 >= 0 ? Int(String(arr2[p2]))! : 0)
- let sum = int1 + int2 + carry
- res = String(sum % 10) + res
- carry = sum / 10
- p1 -= 1
- p2 -= 1
- }
- return (res , carry)
- }
- print(addDoubleString("1.5", "2.50"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement