Преобразование целых чисел в английские слова в Scala: подробное руководство

В Scala преобразование целых чисел в их английское словесное представление может оказаться полезной задачей при работе с числовыми данными. Независимо от того, создаете ли вы финансовое приложение, создаете отчеты или просто отображаете числа в удобочитаемом формате, возможность преобразования целых чисел в английские слова может значительно улучшить взаимодействие с пользователем. В этой статье мы рассмотрим различные методы решения этой задачи, предоставив примеры кода и используя разговорный язык, чтобы сделать процесс обучения более приятным.

Метод 1: использование сопоставления с образцом
Один из подходов к преобразованию целых чисел в английские слова — использование сопоставления с образцом. Мы можем определить варианты шаблонов для разных диапазонов чисел и рекурсивно разбивать входные данные, пока не достигнем базовых случаев. Вот пример реализации:

def numberToWords(num: Int): String = {
  // Define pattern cases for numbers up to 999
  val ones = Array("", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
  val tens = Array("", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
  val teens = Array("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")

  // Define pattern cases for numbers from 100 to 999
  def convertThreeDigits(n: Int): String = {
    if (n == 0) ""
    else if (n < 10) ones(n)
    else if (n < 20) teens(n - 10)
    else if (n < 100) tens(n / 10) + " " + convertThreeDigits(n % 10)
    else ones(n / 100) + " hundred " + convertThreeDigits(n % 100)
  }
// Handle special cases for zero and negative numbers
  if (num == 0) "zero"
  else if (num < 0) "minus " + numberToWords(-num)
  else convertThreeDigits(num)
}

Метод 2: использование рекурсивного деления
Другой метод предполагает рекурсивное деление числа на 1000 и преобразование остатков. Мы можем определить массив суффиксов и использовать вспомогательную функцию для обработки каждой группы из трех цифр. Вот пример реализации:

def numberToWords(num: Int): String = {
  val suffixes = Array("", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion") // Add more if needed

  def convertThreeDigits(n: Int): String = {
    val ones = Array("", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
    val tens = Array("", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
    val teens = Array("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")

    if (n == 0) ""
    else if (n < 10) ones(n)
    else if (n < 20) teens(n - 10)
    else if (n < 100) tens(n / 10) + " " + convertThreeDigits(n % 10)
    else ones(n / 100) + " hundred " + convertThreeDigits(n % 100)
  }

  if (num == 0) "zero"
  else if (num < 0) "minus " + numberToWords(-num)
  else {
    val parts = num.toString.reverse.grouped(3).toList.map(_.reverse.toInt).reverse
    val words = parts.zip(suffixes).map {
      case (part, suffix) => convertThreeDigits(part) + " " + suffix
    }.filter(_.trim.nonEmpty).reverse
    words.mkString(" ")
  }
}

В этой статье мы рассмотрели два метода преобразования целых чисел в английские слова в Scala. Мы использовали сопоставление с образцом и рекурсивное деление, чтобы разбить числа на более мелкие компоненты и построить представление английского слова. Эти методы обеспечивают гибкость и при необходимости могут быть расширены для обработки больших чисел. Мы надеемся, что эта статья, используя разговорный язык и предоставляя примеры кода, помогла вам понять, как эффективно решить эту задачу в Scala.