2014-09-02 106 views
3

有沒有比u_longUInt64在Swift中容量大的類型?Swift中是否有比u_long/UInt64容量更大的數字類型?

我有一個函數,它非常大的整數,以確定與28位信用卡號碼:

func myFunc(number : /*What to put here?*/) { 
    //body 
} 

什麼類型是否合適?應該號碼被視爲一個字符串?

+0

它可以實現你自己的UInt128類型。或者你可以使用NSDecimalNumber – 2014-09-02 00:53:41

+0

如何實現UInt128? – Carpsen90 2014-09-02 00:56:41

+0

就像UInt64如何實現。建立一個結構,遵守協議,實施必要的方法和運營商 – 2014-09-02 00:57:36

回答

12

信用卡號碼是而不是一個有意義的數學意義上的數字。它是一系列數字,並且CC應該被視爲文本,很像電話號碼。使用固定長度整數值的一個直接問題是代碼不能從「不存在更多數字」同時檢測leading和尾隨零

使用表示CC編號的字符串或特定(自定義)類型,可能在內部使用字符串。數字的長度(以10爲底)然後是數字的數量:這是底層字符串的長度。

如果需要(和何時),則CC號碼(由善意字符串表示)可以在後面編碼爲成適當的二進制表示。

+0

偉大的答案!轉換爲任何數字類型都會遇到信用卡號碼中顯着的前導零的問題。謝謝 – Carpsen90 2014-09-02 01:11:49

+1

@ Carpsen90這就是說,我從來沒有見過這樣的數字 - 但它是爲了表示數據。 – user2864740 2014-09-02 01:17:11

4

您可以實施自己的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 
} 
2

我工作的一個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位。

+0

這很有趣,很棒,謝謝你 – Carpsen90 2014-12-04 22:55:21

0

另一種方法是用繩子工作,並定義數學運算符來對字符串還經營:

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 

這具有理論上允許和數字無限數量的優勢,但具有的缺點事實上,字符串可能並不總是表示數字。

相關問題