Dans Obj-C, je convertissais un entier non signé n en chaîne hexagonale avec
NSString *st = [NSString stringWithFormat:@"%2X", n];
J'ai essayé pendant longtemps de traduire cela en Swift langue, mais sans succès.
Vous pouvez maintenant faire:
let n = 14
var st = String(format:"%02X", n)
st += " is the hexadecimal representation of \(n)"
print(st)
0E is the hexadecimal representation of 14
Noter la 2
dans cet exemple est la largeur du champ et représente la longueur minimale voulu. Le 0
lui dit de compléter le résultat avec 0
est si nécessaire. (Sans le 0
, le résultat serait complété par des espaces de début). Bien entendu, si le résultat est supérieur à deux caractères, la longueur du champ ne sera pas tronquée à une largeur de 2
; il sera étendu à la longueur nécessaire pour afficher le résultat complet.
Cela ne fonctionne que si vous avez importé Foundation
(ceci inclut l'importation de Cocoa
ou UIKit
). Ce n'est pas un problème si vous utilisez iOS ou macOS programmation.
Utilisez des majuscules X
si vous voulez A...F
et _ minuscule x
si vous voulez a...f
:
String(format: "%x %X", 64206, 64206) // "face FACE"
Si vous souhaitez imprimer des valeurs entières supérieures à UInt32.max
, ajoutez ll
( el-el , pas onze ) à la chaîne de format:
let n = UInt64.max
print(String(format: "%llX is hexadecimal for \(n)", n))
FFFFFFFFFFFFFFFF is hexadecimal for 18446744073709551615
Réponse originale
Vous pouvez toujours utiliser NSString
pour le faire. Le format est:
var st = NSString(format:"%2X", n)
Cela fait de st
un NSString
, alors des choses comme +=
ne fonctionnent pas. Si vous voulez pouvoir ajouter à la chaîne avec +=
transformez st
en un String
comme ceci:
var st = NSString(format:"%2X", n) as String
ou
var st = String(NSString(format:"%2X", n))
ou
var st: String = NSString(format:"%2X", n)
Ensuite, vous pouvez faire:
let n = 123
var st = NSString(format:"%2X", n) as String
st += " is the hexadecimal representation of \(n)"
// "7B is the hexadecimal representation of 123"
Dans Swift, il existe une méthode spécifique init
sur String
pour exactement ceci:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
Avec Swift 5, selon vos besoins, vous pouvez choisir l’une des trois méthodes suivantes pour résoudre votre problème.
String
's init(_:radix:uppercase:)
initializerSwift String
a un initialiseur init(_:radix:uppercase:)
avec la déclaration suivante:
init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger
Crée une chaîne représentant la valeur donnée en base 10 ou une autre base spécifiée.
Le code de Playground ci-dessous montre comment créer une instance String
représentant un entier au format hexadécimal en utilisant init(_:radix:uppercase:)
et sans avoir à importer Foundation
:
let string1 = String(2, radix: 16)
print(string1) // prints: "2"
let string2 = String(211, radix: 16)
print(string2) // prints: "d3"
let string3 = String(211, radix: 16, uppercase: true)
print(string3) // prints: "D3"
String
's init(format:_:)
initializerFoundation
fournit String
un init(format:_:)
initialiseur. init(format:_:)
a la déclaration suivante:
init(format: String, _ arguments: CVarArg...)
Renvoie un objet
String
initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées.
Le Guide de programmation de chaînes de Apple fournit une liste des spécificateurs de format pris en charge par String
et NSString
. Parmi ces spécificateurs de format, %X
A le suivant description :
Entier 32 bits non signé (
unsigned int
), Imprimé au format hexadécimal à l'aide des chiffres 0 à 9 et des majuscules A à F.
Le code de Playground ci-dessous montre comment créer une instance String
qui représente une valeur entière au format hexadécimal avec init(format:_:)
:
import Foundation
let string1 = String(format:"%X", 2)
print(string1) // prints: "2"
let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"
let string3 = String(format:"%02X", 211)
print(string3) // prints: "D3"
let string4 = String(format: "%02X, %02X, %02X", 12, 121, 255)
print(string4) // prints: "0C, 79, FF"
String
's init(format:arguments:)
initializerFoundation
fournit String
un init(format:arguments:)
initialiseur. init(format:arguments:)
a la déclaration suivante:
init(format: String, arguments: [CVarArg])
Renvoie un objet
String
initialisé à l'aide d'une chaîne de format donnée en tant que modèle dans lequel les valeurs d'argument restantes sont substituées en fonction des paramètres régionaux par défaut de l'utilisateur.
Le code de Playground ci-dessous montre comment créer une instance String
qui représente une valeur entière au format hexadécimal avec init(format:arguments:)
:
import Foundation
let string1 = String(format:"%X", arguments: [2])
print(string1) // prints: "2"
let string2 = String(format:"%02X", arguments: [1])
print(string2) // prints: "01"
let string3 = String(format:"%02X", arguments: [211])
print(string3) // prints: "D3"
let string4 = String(format: "%02X, %02X, %02X", arguments: [12, 121, 255])
print(string4) // prints: "0C, 79, FF"
Utiliser
let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"
Dans Swift3, la base d'importation n'est pas requise, du moins pas dans un projet. String devrait avoir toutes les fonctionnalités de NSString.
Les réponses ci-dessus fonctionnent correctement pour les valeurs comprises dans la plage d'un Int de 32 bits, mais les valeurs dépassant cette valeur ne fonctionneront pas à mesure que la valeur sera reportée.
Vous devez utiliser le modificateur de longueur pour les valeurs supérieures à 32bit Int
% x = entier non signé de 32 bits (unsigned int)
ll = Modificateurs de longueur spécifiant qu'un spécificateur de conversion suivant d, o, u, x ou X s'applique à un argument long long ou unsigned long long.
let hexString = String(format:"%llX", decimalValue)