You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

Swift数字转英文单词完整实现方案

一、核心:整数转英文单词逻辑

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", and numberToWords(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 numberToWords function to prepend "Negative " for negative inputs
  • Limit text field input length to avoid exceeding Swift's Int value limits
  • For SwiftUI projects, replace the UIKit components with TextField and Text, using @State to bind input values and trigger conversions

内容的提问来源于stack exchange,提问作者Hadiseh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:11:06