scala - 将阿拉伯数字转换为中文财务数字

标签 scala functional-programming

我正在尝试在函数式编程中创建一个函数,它接收一个普通的 Int 值并将其转换为金融中文数字并返回一个字符串,例如:301 = 三百零一。首先,我有两张 map ,一张包含从 0 到 9 的每个数字,另一张包含从 10 到 1000000 的指数。

有效数字:Map[Int, String] = Map(0 -> "〇", 1 -> "壹", 2 -> "贰", 3 -> "参", 4 -> "肆", 5 -> "伍", 6 -> "陆", 7 -> "柒", 8 -> "捌", 9 -> "玖");

val 指数: Map[Int, String] = Map(1 -> "", 10 -> "拾", 100 -> "佰", 1000 -> "仟", 10000 -> "万", 100000 -> "亿", 1000000 -> "兆");

对于那些不知道的人,这里有一些关于中文数字如何工作的解释。如果您已经知道,请不要费心阅读本段。在中文数字中,当你想写一个大数字时,例如 5000,你写下 5 和 1000 符号(伍仟)来表示你正在乘以 5 * 1000。如果你有 539,它是 5< em>100 + 310 + 9。这将是伍佰参拾玖。最后,如果数字在乘法之间有 0,那么无论有多少个 0,您在其他字符之间只写一个 0。例如:501 = 5100 + 1。这就是伍佰〇壹。最后一个校准例子:50103 = 510000 + 1*100 + 3。这是伍万〇壹佰参。

所以我能做的是:

def format(unit: Int): String = {
val l = unit.toString.map(_.asDigit).toList
if(l.isEmpty) ""
else if(l.tail.isEmpty) digits(l.head)
else digits(l.head) + format(l.tail.mkString.toInt)
}

这会将字符一一翻译。例如:

format(135) "壹參伍"

我不知道如何继续。

最佳答案

如果我正确理解你的问题,你可以这样做:

def toChineseFinancial(number: Int): String = {
  val digits = number.toString.iterator.map(_.asDigit).toList
  val length = digits.length
  val exponents = List.tabulate(length)(n => math.pow(10, n).toInt)
  
  val (sb, _) =
    digits
      .iterator
      .zip(exponents.reverseIterator)
      .foldLeft(new collection.mutable.StringBuilder(length * 2) -> false) {
        case ((sb, flag), (digit, exp)) =>
          if (digit == 0) sb -> true
          else if (flag) sb.append("〇").append(digitsMap(digit)).append(exponentsMap(exp)) -> false
          else sb.append(digitsMap(digit)).append(exponentsMap(exp)) -> false
      }
  
  sb.result()
}

您可以看到它正在运行here .


注意:我使用了 mutable.StringBuilder 因为构建 Strings 有点昂贵,但如果您想避免任何类型的可变性,您可以轻松地将其替换为一个普通的字符串

关于scala - 将阿拉伯数字转换为中文财务数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64485015/

相关文章:

scala - 用Scala中的占位符替换字符串中的值

scala - 在调度中发送自定义 POST https 请求(+cookies,+headers)

scala - trait 中的覆盖函数

scala - 如何在Zeppelin/Spark/Scala中漂亮地打印数据框?

scala - 通过反射获取 `Symbol` 的方法参数

performance - 如何在 Haskell 中编写高效的动态规划算法?

scala - 如何将函数映射到函数的 HList 从某种类型到某种类型?

scala - 在不够多态的情况下,为什么实现 `List a -> List a -> List a` 的方法比 `List Char -> List Char -> List Char` 少

Javascript、函数链和事件?

scala - 如何在我的 Spark 应用程序中使用 OpenHashSet?