import Foundation import UIKit import TelegramCore import TelegramPresentationData let walletAddressLength: Int = 48 public func formatTonAddress(_ address: String) -> String { var address = address address.insert("\n", at: address.index(address.startIndex, offsetBy: address.count / 2)) return address } public func formatTonUsdValue(_ value: Int64, divide: Bool = true, rate: Double = 1.0, dateTimeFormat: PresentationDateTimeFormat) -> String { let decimalSeparator = dateTimeFormat.decimalSeparator let normalizedValue: Double = divide ? Double(value) / 1000000000 : Double(value) var formattedValue = String(format: "%0.2f", normalizedValue * rate) formattedValue = formattedValue.replacingOccurrences(of: ".", with: decimalSeparator) if let dotIndex = formattedValue.firstIndex(of: decimalSeparator.first!) { let integerPartString = formattedValue[.. String { var balanceText = "\(abs(value))" while balanceText.count < 10 { balanceText.insert("0", at: balanceText.startIndex) } balanceText.insert(contentsOf: dateTimeFormat.decimalSeparator, at: balanceText.index(balanceText.endIndex, offsetBy: -9)) while true { if balanceText.hasSuffix("0") { if balanceText.hasSuffix("\(dateTimeFormat.decimalSeparator)0") { balanceText.removeLast() balanceText.removeLast() break } else { balanceText.removeLast() } } else { break } } if let dotIndex = balanceText.range(of: dateTimeFormat.decimalSeparator) { if let endIndex = balanceText.index(dotIndex.upperBound, offsetBy: 2, limitedBy: balanceText.endIndex) { balanceText = String(balanceText[balanceText.startIndex.. String { var balanceText = presentationStringsFormattedNumber(Int32(amount.value), dateTimeFormat.groupingSeparator) let fraction = Double(amount.nanos) / 10e6 if fraction > 0.0 { balanceText.append(dateTimeFormat.decimalSeparator) balanceText.append("\(Int32(fraction))") } if amount.value < 0 { } else if showPlus { balanceText.insert("+", at: balanceText.startIndex) } return balanceText } private let invalidAddressCharacters = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=").inverted public func isValidTonAddress(_ address: String, exactLength: Bool = false) -> Bool { if address.count > walletAddressLength || address.rangeOfCharacter(from: invalidAddressCharacters) != nil { return false } if exactLength && address.count != walletAddressLength { return false } return true } public func tonAmountAttributedString(_ string: String, integralFont: UIFont, fractionalFont: UIFont, color: UIColor, decimalSeparator: String) -> NSAttributedString { let result = NSMutableAttributedString() if let range = string.range(of: decimalSeparator) { let integralPart = String(string[..