有沒有比u_long或UInt64在Swift中容量大的類型?Swift中是否有比u_long/UInt64容量更大的數字類型?
我有一個函數,它非常大的整數,以確定與28位信用卡號碼:
func myFunc(number : /*What to put here?*/) {
//body
}
什麼類型是否合適?應該號碼被視爲一個字符串?
有沒有比u_long或UInt64在Swift中容量大的類型?Swift中是否有比u_long/UInt64容量更大的數字類型?
我有一個函數,它非常大的整數,以確定與28位信用卡號碼:
func myFunc(number : /*What to put here?*/) {
//body
}
什麼類型是否合適?應該號碼被視爲一個字符串?
信用卡號碼是而不是一個有意義的數學意義上的數字。它是一系列數字,並且CC應該被視爲文本,很像電話號碼。使用固定長度整數值的一個直接問題是代碼不能從「不存在更多數字」同時檢測leading和尾隨零。
使用表示CC編號的字符串或特定(自定義)類型,可能在內部使用字符串。數字的長度(以10爲底)然後是數字的數量:這是底層字符串的長度。
如果需要(和何時),則CC號碼(由善意字符串表示)可以在後面編碼爲成適當的二進制表示。
偉大的答案!轉換爲任何數字類型都會遇到信用卡號碼中顯着的前導零的問題。謝謝 – Carpsen90 2014-09-02 01:11:49
@ Carpsen90這就是說,我從來沒有見過這樣的數字 - 但它是爲了表示數據。 – user2864740 2014-09-02 01:17:11
您可以實施自己的UInt128
類型。或者使用NSDecimalNumber
要實現UInt128
struct UInt128 {
var low : UInt64 = 0;
var high : UInt64 = 0;
}
,並可以實現運營商
infix func + (l: UInt128, r: UInt128) -> UInt128 {
// do your work... care with overflow
}
我工作的一個BigNumber庫,你可以做一些大的運算量。實際上,該庫基於GNU Multiple Precision(GMP)庫(請參閱:https://gmplib.org),我編寫了一個Objective-C/Swift包裝器。目前大整數數學,包括很多運算符重載,都是可能的。一個代碼示例是這樣:
var err : NSError?
var bi1 = BigInt(nr: 12468642135797531)
var bi2 = BigInt(nr: "12345678901011121314151617181920", error: &err)
var res = bi1 * bi2
println("Multiply 2 BigInts: bi1 * bi2 = \(res.toString())")
導致:
Multiply 2 BigInts: bi1 * bi2 = 153933852140173822960829726365674325601913839520
你可以找到在圖書館:https://github.com/githotto/osxgmp
我認爲它很容易做一些「信用卡號碼'偶數數字遠遠超過28位。
這很有趣,很棒,謝謝你 – Carpsen90 2014-12-04 22:55:21
另一種方法是用繩子工作,並定義數學運算符來對字符串還經營:
func +(lhs: String, rhs: Int8) -> String
func +(lhs: String, rhs: Int16) -> String
func +(lhs: String, rhs: Int32) -> String
func +(lhs: String, rhs: Int64) -> String
func +(lhs: String, rhs: String) -> String
// ... other operators
這具有理論上允許和數字無限數量的優勢,但具有的缺點事實上,字符串可能並不總是表示數字。
它可以實現你自己的UInt128類型。或者你可以使用NSDecimalNumber – 2014-09-02 00:53:41
如何實現UInt128? – Carpsen90 2014-09-02 00:56:41
就像UInt64如何實現。建立一個結構,遵守協議,實施必要的方法和運營商 – 2014-09-02 00:57:36