我正在尝试在函数式编程中创建一个函数,它接收一个普通的 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/