Ios 在Swift中连接类似Int的字符串?
我需要像这样的东西Ios 在Swift中连接类似Int的字符串?,ios,swift4.1,Ios,Swift4.1,我需要像这样的东西 var a = 1 var b = 2 var c = a + b should be 12 (Int) instead of 3. var a = 12 var b = 34 var c = a + b should be 1234 (Int) instead of 46. 我不知道我们怎么能为任何数字这样做 一种方法是将两个都是Int的字符串转换成String,连接并再次将它转换成Int,但我认为这不是很有效 如果您有解决方案,请提前感谢。您可以这样写: extens
var a = 1
var b = 2
var c = a + b should be 12 (Int) instead of 3.
var a = 12
var b = 34
var c = a + b should be 1234 (Int) instead of 46.
我不知道我们怎么能为任何数字这样做
一种方法是将两个都是Int的字符串转换成String,连接并再次将它转换成Int,但我认为这不是很有效
如果您有解决方案,请提前感谢。您可以这样写:
extension Int {
func concatenateDecimalDigits(in other: Int) -> Int {
let scale: Int
switch other {
case 0...9:
scale = 10
case 10...99:
scale = 100
case 100...999:
scale = 1000
case 1000...9999:
scale = 10000
case 10000...99999:
scale = 100000
case 100000...999999:
scale = 1000000
//You need to add more cases if you need...
//...
//...
default:
scale = 0 //ignore invalid values
}
return self * scale + other
}
}
var a = 1
var b = 2
print( a.concatenateDecimalDigits(in: b) ) //->12
a = 12
b = 34
print( a.concatenateDecimalDigits(in: b) ) //->1234
a = 122344
b = 9022
print( a.concatenateDecimalDigits(in: b) ) //->1223449022
您可以编写一些逻辑来计算
比例
,而不使用开关
,但这没有多大区别。12+34=12*10^2+34=1200+34=1234
func logC(val: Double, forBase base: Double) -> Double {
return log(val)/log(base)
}
var a = 10
var b = 0
let x = b == 10 ? 2 : b == 0 ? 1 : ceil(logC(val: Double(b), forBase: 10))
var c = Int(Double(a) * pow(10, x) + Double(b))
print(c)
任意两个
Int的通用解决方案
:
您需要计算乘法器的位数,如下所示:
func numberOfDigits(_ num: Int) -> Int {
var count = 0
var number = num
while number > 0 {
number = number / 10
count += 1
}
return count
}
将其用作:
let a = 11
let b = 24
let noOfDigit = numberOfDigits(b)
let multiplier = pow(Double(10), Double(noOfDigit))
let c = a * Int(multiplier) + b
print(c)
在一行中,如下所示:
let c = a * Int(pow(Double(10), Double(numberOfDigits(b)))) + b
您可以通过如下所示的简单转换完成此操作:
var a = 1
var b = 2
var c = Int("\(a)\(b)") // Result 12
var a1 = 12
var b1 = 34
var c1 = Int("\(a1)\(b1)") // Result 1234
var a2 = 122344
var b2 = 9022
var c2 = Int("\(a2)\(b2)") // Result 1223449022
var c=a*10+b
respvar c=a*100+b
,您只需检查a与10、100相乘的“大”程度,依此类推。@AndreasOetjen我知道,但这不是一个正确的解决方案,var a=122344和b=9022,这个呢?每次都需要编写不同的代码。您可以使用第10个对数找出“b”的维数(例如分数之前的部分),然后计算10的幂,并将其乘以a
。或者,更有效的方法是使用switch-case语句。是否有人检查过这些解决方案是否比将int转换为string和back更有效?也许把这个也加在答案上?我查过了。我的解决方案(在操场上)比字符串连接快3倍。这很好,但我认为它没有那么高的性能,因为log
function@AndreasOetjen这是真的,它没有性能,当我没有找到任何快速功能时,我很惊讶,你认为它应该在Swift 5中吗?你可以将第二个数字转换成字符串,然后得到它的长度。或者直接除以10,直到得到零。它不起作用,尝试使用a=10
和b=10
,得到的是110
,而不是1010
。您必须将x
增加一个:让x=ceil(logC(val:Double(b),forBase:10))+1
而且,如果b=0
,它也不起作用;在这种情况下,您将得到x=-inf
我认为这是最有效/性能最好的解决方案,而无需任何log
计算。但是它并不像往常那样好看:-)顺便说一下,这可以简化为类似于let scales=[1,10100100010000,…];设scale=(scales.first{other<$0})??0
@Sulthan,是的,这是一个可能的选项,我已经在一些逻辑中包括了它来计算比例
,而不使用开关
。事实上,我选择我的代码是为了易于理解的可读性,而不是为了性能或代码简洁性。这不是答案,这是@Jigar已经提出的问题:一种方法是将两个Int转换为String,串联并再次将该字符串转换为Int,但我认为这不是有效的。