Swift中如何将整数转换为对应英文单词(含文本框输入场景)
Got it, let's tackle these two Swift problems step by step! Below is a practical, easy-to-implement solution for both converting a single integer to its English word equivalent and building a text field input-to-word conversion feature.
一、核心:整数转英文单词逻辑
First, we'll build a reusable function that handles converting any non-negative integer (from single digits up to billion-scale numbers) into proper English words.
1. Define Basic Mapping Tables
We need lookup tables for foundational number words:
private let ones = ["", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"] private let tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"] private let thousands = ["", "Thousand", "Million", "Billion"]
2. Helper Function for Numbers < 1000
This handles the conversion for values between 0-999, which we'll reuse for larger numbers:
private func convertLessThanOneThousand(_ number: Int) -> String { var result = "" let hundreds = number / 100 let remainder = number % 100 // Handle hundreds place if hundreds != 0 { result += "\(ones[hundreds]) Hundred" if remainder != 0 { result += " " } } // Handle tens and ones place if remainder < 20 { result += ones[remainder] } else { let ten = remainder / 10 let one = remainder % 10 result += tens[ten] if one != 0 { result += " \(ones[one])" } } return result.trimmingCharacters(in: .whitespaces) }
3. Full Number-to-Words Function
Combine the helper function to handle any non-negative integer:
func numberToWords(_ number: Int) -> String { guard number >= 0 else { return "Negative numbers are not supported" } guard number != 0 else { return "Zero" } var num = number var result = "" var scaleIndex = 0 while num > 0 { let remainder = num % 1000 if remainder != 0 { let segment = convertLessThanOneThousand(remainder) result = "\(segment) \(thousands[scaleIndex]) \(result)" } num /= 1000 scaleIndex += 1 } return result.trimmingCharacters(in: .whitespaces) }
- Test it out:
numberToWords(1)returns"One",numberToWords(11)returns"Eleven", andnumberToWords(1234)returns"One Thousand Two Hundred Thirty Four".
二、文本框输入转英文功能实现
Now let's integrate this logic into a UIKit-based text field to enable real-time conversion as the user types.
1. UI Setup & Logic Integration
class NumberConverterVC: UIViewController { // UI Components private let inputTextField: UITextField = { let tf = UITextField() tf.keyboardType = .numberPad tf.borderStyle = .roundedRect tf.placeholder = "Enter a number" return tf }() private let resultLabel: UILabel = { let label = UILabel() label.numberOfLines = 0 label.textAlignment = .center label.font = .systemFont(ofSize: 16) return label }() override func viewDidLoad() { super.viewDidLoad() setupUI() setupTextFieldListener() } // Configure UI layout private func setupUI() { view.backgroundColor = .white inputTextField.translatesAutoresizingMaskIntoConstraints = false resultLabel.translatesAutoresizingMaskIntoConstraints = false view.addSubview(inputTextField) view.addSubview(resultLabel) NSLayoutConstraint.activate([ inputTextField.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 40), inputTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), inputTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20), resultLabel.topAnchor.constraint(equalTo: inputTextField.bottomAnchor, constant: 30), resultLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), resultLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20) ]) } // Listen for text field changes private func setupTextFieldListener() { inputTextField.addTarget(self, action: #selector(onTextFieldTextChanged), for: .editingChanged) } @objc private func onTextFieldTextChanged() { guard let inputText = inputTextField.text, !inputText.isEmpty, let number = Int(inputText) else { resultLabel.text = "Please enter a valid positive integer" return } resultLabel.text = numberToWords(number) } // Paste the numberToWords function and helper mappings here private let ones = ["", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"] private let tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"] private let thousands = ["", "Thousand", "Million", "Billion"] private func convertLessThanOneThousand(_ number: Int) -> String { var result = "" let hundreds = number / 100 let remainder = number % 100 if hundreds != 0 { result += "\(ones[hundreds]) Hundred" if remainder != 0 { result += " " } } if remainder < 20 { result += ones[remainder] } else { let ten = remainder / 10 let one = remainder % 10 result += tens[ten] if one != 0 { result += " \(ones[one])" } } return result.trimmingCharacters(in: .whitespaces) } func numberToWords(_ number: Int) -> String { guard number >= 0 else { return "Negative numbers are not supported" } guard number != 0 else { return "Zero" } var num = number var result = "" var scaleIndex = 0 while num > 0 { let remainder = num % 1000 if remainder != 0 { let segment = convertLessThanOneThousand(remainder) result = "\(segment) \(thousands[scaleIndex]) \(result)" } num /= 1000 scaleIndex += 1 } return result.trimmingCharacters(in: .whitespaces) } }
2. Key Features
- Restricts input to numbers only using a number pad keyboard
- Converts input to English words in real time as the user types
- Includes input validation to handle empty or non-numeric entries
- Supports large numbers up to the billion range
三、Extra Optimization Tips
- Add negative number support by modifying the
numberToWordsfunction to prepend"Negative "for negative inputs - Limit text field input length to avoid exceeding Swift's
Intvalue limits - For SwiftUI projects, replace the UIKit components with
TextFieldandText, using@Stateto bind input values and trigger conversions
内容的提问来源于stack exchange,提问作者Hadiseh

