ใน Obj-C ฉันเคยแปลงจำนวนเต็ม n ที่ไม่ได้ลงนามเป็นสตริงฐานสิบหกด้วย
NSString *st = [NSString stringWithFormat:@"%2X", n];
ฉันพยายามแปลสิ่งนี้เป็นภาษา Swift มานานแล้ว แต่ไม่สำเร็จ
ใน Obj-C ฉันเคยแปลงจำนวนเต็ม n ที่ไม่ได้ลงนามเป็นสตริงฐานสิบหกด้วย
NSString *st = [NSString stringWithFormat:@"%2X", n];
ฉันพยายามแปลสิ่งนี้เป็นภาษา Swift มานานแล้ว แต่ไม่สำเร็จ
คำตอบ:
ตอนนี้คุณสามารถทำได้:
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
หมายเหตุ: 2
ในตัวอย่างนี้คือความกว้างของฟิลด์และแสดงถึงความยาวขั้นต่ำที่ต้องการ คำสั่ง0
บอกให้เพิ่มผลลัพธ์ด้วยเครื่องหมายนำหน้า0
หากจำเป็น (หากไม่มี0
ผลลัพธ์จะถูกเติมด้วยช่องว่างนำหน้า) แน่นอนถ้าผลที่มีขนาดใหญ่กว่าตัวละครทั้งสองความยาวเขตข้อมูลจะไม่ถูกตัดให้ความกว้างของ2
; มันจะขยายเป็นความยาวเท่าใดก็ได้เพื่อแสดงผลลัพธ์แบบเต็ม
จะใช้ได้เฉพาะเมื่อคุณFoundation
นำเข้า (ซึ่งรวมถึงการนำเข้าCocoa
หรือUIKit
) นี่ไม่ใช่ปัญหาหากคุณกำลังเขียนโปรแกรมiOSหรือmacOS
ใช้ตัวพิมพ์ใหญ่X
หากคุณต้องการA...F
และตัวพิมพ์เล็กx
หากคุณต้องการa...f
:
String(format: "%x %X", 64206, 64206) // "face FACE"
หากคุณต้องการพิมพ์ค่าจำนวนเต็มมากกว่าUInt32.max
ให้เพิ่มll
( el-elไม่ใช่สิบเอ็ด ) ลงในสตริงรูปแบบ:
let n = UInt64.max
print(String(format: "%llX is hexadecimal for \(n)", n))
FFFFFFFFFFFFFFFF is hexadecimal for 18446744073709551615
คำตอบเดิม
คุณยังสามารถใช้NSString
เพื่อทำสิ่งนี้ได้ รูปแบบคือ:
var st = NSString(format:"%2X", n)
นี้จะทำให้ดังนั้นแล้วสิ่งที่ชอบจะไม่ได้ทำงาน หากคุณต้องการที่จะสามารถต่อท้ายสตริงด้วยการทำให้เป็นแบบนี้:st
NSString
+=
+=
st
String
var st = NSString(format:"%2X", n) as String
หรือ
var st = String(NSString(format:"%2X", n))
หรือ
var st: String = NSString(format:"%2X", n)
จากนั้นคุณสามารถทำได้:
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"
ใน Swift มีinit
วิธีการเฉพาะString
สำหรับสิ่งนี้:
let hex = String(0xF, radix: 16, uppercase: false)
println("hex=\(hex)") // Output: f
"0xF"
เป็นUInt
?
let number = UInt("0xF".stringByReplacingOccurrencesOfString("0x", withString:""), radix: 16)
, number
จะเป็นชนิดUInt?
หากคุณมากขึ้นจำเป็นต้องถามคำถาม :)
String(0xf, radix: 0x10, uppercase: false)
ด้วย Swift 5 ตามความต้องการของคุณคุณสามารถเลือกหนึ่งในสามวิธีต่อไปนี้เพื่อแก้ปัญหาของคุณ
String
's init(_:radix:uppercase:)
initializerSwift String
มีinit(_:radix:uppercase:)
initializer พร้อมคำประกาศต่อไปนี้:
init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false) where T : BinaryInteger
สร้างสตริงที่แทนค่าที่กำหนดในฐาน 10 หรือฐานอื่นที่ระบุ
โค้ด Playground ด้านล่างแสดงวิธีสร้างString
อินสแตนซ์ที่แสดงค่าจำนวนเต็มในรูปแบบฐานสิบหกโดยใช้init(_:radix:uppercase:)
และไม่ต้องนำเข้า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
ให้String
ตัวinit(format:_:)
เริ่มต้น init(format:_:)
มีประกาศดังต่อไปนี้:
init(format: String, _ arguments: CVarArg...)
ส่งคืน
String
อ็อบเจ็กต์ที่เริ่มต้นโดยใช้สตริงรูปแบบที่กำหนดเป็นเทมเพลตซึ่งใช้แทนค่าอาร์กิวเมนต์ที่เหลือ
ของแอปเปิ้ลString โปรแกรมคู่มือให้รายการ specifiers รูปแบบที่ได้รับการสนับสนุนโดยและString
NSString
ในบรรดาตัวระบุรูปแบบ%X
มีคำอธิบายดังต่อไปนี้:
จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ (
unsigned int
) พิมพ์ด้วยเลขฐานสิบหกโดยใช้ตัวเลข 0–9 และตัวพิมพ์ใหญ่ A – F
โค้ด Playground ด้านล่างแสดงวิธีสร้างString
อินสแตนซ์ที่แสดงค่าจำนวนเต็มในรูปแบบเลขฐานสิบหกด้วย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
ให้String
ตัวinit(format:arguments:)
เริ่มต้น init(format:arguments:)
มีประกาศดังต่อไปนี้:
init(format: String, arguments: [CVarArg])
ส่งคืน
String
อ็อบเจ็กต์ที่เริ่มต้นโดยใช้สตริงรูปแบบที่กำหนดเป็นเทมเพลตซึ่งค่าอาร์กิวเมนต์ที่เหลือจะถูกแทนที่ตามโลแคลเริ่มต้นของผู้ใช้
โค้ด Playground ด้านล่างแสดงวิธีสร้างString
อินสแตนซ์ที่แสดงค่าจำนวนเต็มในรูปแบบเลขฐานสิบหกด้วย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"
ใช้
let string2 = String(format:"%02X", 1)
print(string2) // prints: "01"
ในพื้นฐานการนำเข้า Swift3 ไม่จำเป็นต้องมีอย่างน้อยก็ไม่ได้อยู่ในโครงการ String ควรมีฟังก์ชันทั้งหมดเป็น NSString
คำตอบข้างต้นใช้ได้ดีสำหรับค่าในช่วง 32 บิต Int แต่ค่าที่เกินนี้จะใช้ไม่ได้เนื่องจากค่าจะพลิกไป
คุณต้องใช้ตัวปรับความยาวสำหรับค่าที่มากกว่า 32 บิต Int
% x = จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ (int ไม่ได้ลงนาม)
ll = ตัวปรับความยาวที่ระบุว่าตัวระบุการแปลง d, o, u, x หรือ X ต่อไปนี้ใช้กับอาร์กิวเมนต์ long long ที่ยาวหรือไม่ได้ลงนาม
let hexString = String(format:"%llX", decimalValue)
Int("hexaString", radix: 16)
สวิฟต์ 5.2.4
let value = 200
let hexString = String(format: "%02X", value)
String s = "0x" + String(n, radix: 16)