簡體   English   中英

將Swift字符串轉換為UTF-8並使用char的ASCII值進行算術

[英]Converting Swift String to UTF-8 and doing arithmetic using char's ASCII value

我正在嘗試將遺留的Objective-C函數轉換為Swift,並因此遇到一些障礙。 這是Objective-C函數-

- (SHCardType)cardType:(NSString *)cardNum {
    if (cardNum.length <= 0) {
        return SHCTUnknown;
    }
    const char *s = [cardNum UTF8String];

    if (sizeof(cardTypes[0]) == 0) {
        return SHCTUnknown;
    }
    int cardsCount = sizeof(cardTypes) / sizeof(cardTypes[0]);
    for (int i = 0; i < cardsCount; i++) {
        int dig = log10(cardTypes[i].max) + 1;
        int n = 0;

        for (int j = 0; j < dig; j++) {
            n = n * 10 + (s[j] - '0');
        }

        if ((cardTypes[i].min <= n) && (n <= cardTypes[i].max)) {
            SHCardType cardType = cardTypes[i].cardType;
            int numLength = 16;
            if (cardType == SHCTAmericanExpress) {
                // Length is 15. Should confirm its type before all card number is entered.
                return cardType;
            } else if (cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubenRoute || cardType == SHCTDinersClubInternational || cardType == SHCTDinersClubUnitedStatesCanada) {
                numLength = 14;
            }

            // For DinersClubCarteBlanche card, the length may be 16.
            if (numLength == cardNum.length || cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubInternational) {
                return cardType;
            }
        }
    }

    return SHCTUnknown;
}

我在尋找Swift等效項的兩行時遇到了麻煩

const char *s = [cardNum UTF8String];

我可以使用Swift函數將String轉換為UTF-8嗎?

n = n * 10 + (s[j] - '0');

如何快速顯示字符“ 0”。 我可以使用'-'操作數嗎?

任何指針將不勝感激。

嘗試這個:

let s = cardNum.cStringUsingEncoding(NSUTF8StringEncoding)! // s is an Array<Int8>
...
let CHAR_ZERO : Int8 = 48
n = n * 10 + (s[j] - CHAR_ZERO);

在Swift中將字符轉換為ASCII表中的整數值很麻煩。 因此,您也可以將其定義為整數常量。

編輯:如果您想以更安全的方式進行展開:

let s : Array<Int8>
if cardNum.canBeConvertedToEncoding(NSUTF8StringEncoding) {
    s = cardNum.cStringUsingEncoding(NSUTF8StringEncoding)!
} else {
    s = []
    // Handle error
}

如何獲得字符的Unicode代碼點?

let ch: Character = "A"
let s = String(ch).unicodeScalars
s[s.startIndex].value // returns 65

所以也許嘗試:

let z = "0".unicodeScalars
s[j] - z[z.startIndex].value

讓我知道事情的后續。

我不確定,但是,您可以嘗試以下操作:

func cardType(cardNum: String) -> SHCardType {
    if cardNum.length <= 0 {
        return SHCTUnknown
    }
    let s: Character = cardNum.UTF8String()
    if sizeof([0]) == 0 {
        return SHCTUnknown
    }
    var cardsCount: Int = sizeof() / sizeof([0])
    for var i = 0; i < cardsCount; i++ {
        var dig: Int = log10(cardTypes[i].max) + 1
        var n: Int = 0
        for var j = 0; j < dig; j++ {
            n = n * 10 + (s[j] - "0")
        }
        if (cardTypes[i].min <= n) && (n <= cardTypes[i].max) {
            var cardType: SHCardType = cardTypes[i].cardType
            var numLength: Int = 16
            if cardType == SHCTAmericanExpress {
                return cardType
            }
            else {
                if cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubenRoute || cardType == SHCTDinersClubInternational || cardType == SHCTDinersClubUnitedStatesCanada {
                    numLength = 14
                }
            }
            if numLength == cardNum.length || cardType == SHCTDinersClubCarteBlanche || cardType == SHCTDinersClubInternational {
                return cardType
            }
        }
    }
    return SHCTUnknown
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM