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

中文数字转阿拉伯数字函数开发及向量子集值规则调整技术问询

我之前也处理过类似的中文数字转阿拉伯数字的需求,你的思路方向是对的,但遇到大单位(萬、兆这类)时的障碍,核心原因是中文数字是分级进制的,不能直接把所有数字和单位简单相乘求和。这里给你一套可行的解决方案:

核心思路:分级分段处理

中文数字的结构是按大级单位(兆、億、萬)划分层级的,每一层内部用小级单位(十、百、千)细化数值。我们可以把整个数字拆分为「数值段+大单位」的模块,每个模块单独计算后再累加,就能避免跨量级的计算混乱。

步骤1:定义基础映射

先明确数字和单位的映射,把大、小级单位分开处理,方便后续分段:

# 基础数字映射
digit <- c('〇'=0,'一'=1,'二'=2,'三'=3,'四'=4,'五'=5,'六'=6,'七'=7,'八'=8,'九'=9)
# 小级单位(十、百、千)
scale_small <- c('十'=10^1,'百'=10^2,'千'=10^3)
# 大级单位(按量级从高到低排序)
scale_large <- c('兆'=10^12,'億'=10^8,'萬'=10^4)

步骤2:实现小级单位处理函数

先写一个函数处理「十、百、千」这类小级单位的数值计算,同时兼容省略开头数字的情况(比如「十」默认是10,「百」默认是100):

process_small_scale <- function(s) {
  if (nchar(s) == 0) return(0)
  total <- 0
  current_digit <- 0
  
  # 处理开头无数字的情况(如"十" → 10)
  if (substr(s, 1, 1) %in% names(scale_small)) {
    current_digit <- 1
    s <- substr(s, 2, nchar(s))
  }
  
  for (i in seq(nchar(s))) {
    char <- substr(s, i, i)
    if (char %in% names(digit)) {
      current_digit <- digit[char]
    } else if (char %in% names(scale_small)) {
      total <- total + current_digit * scale_small[char]
      current_digit <- 0
    }
  }
  
  # 加上最后一个无单位的数字(比如"五千三"里的"三")
  total <- total + current_digit
  return(total)
}

步骤3:实现完整的转换函数

通过大级单位分割数字串,逐个处理每个「数值段+大单位」模块,最后累加结果:

chinese_to_arabic <- function(chinese_num) {
  # 提取大级单位名称,用于分割字符串
  large_unit_names <- names(scale_large)
  
  # 在每个大级单位后插入分隔符,方便拆分
  for (unit in large_unit_names) {
    chinese_num <- gsub(unit, paste0(unit, "|"), chinese_num)
  }
  
  # 拆分出各个独立模块
  segments <- strsplit(chinese_num, "\\|")[[1]]
  segments <- segments[segments != ""]
  
  total <- 0
  for (seg in segments) {
    # 判断当前模块是否包含大级单位
    has_large_unit <- any(grepl(paste(large_unit_names, collapse="|"), seg))
    
    if (has_large_unit) {
      # 提取大单位和对应的数值段
      unit <- stringr::str_extract(seg, paste(large_unit_names, collapse="|"))
      num_part <- gsub(unit, "", seg)
      # 计算小级数值后乘以大单位量级
      small_val <- process_small_scale(num_part)
      total <- total + small_val * scale_large[unit]
    } else {
      # 无大单位的模块直接计算小级数值
      total <- total + process_small_scale(seg)
    }
  }
  
  return(total)
}

测试示例

你可以用这些案例验证功能:

# 基础测试
chinese_to_arabic("三兆四萬五千")          # 输出:3000000045000
chinese_to_arabic("一億二千三百四十五萬六千七百八十九") # 输出:123456789
chinese_to_arabic("十")                   # 输出:10
chinese_to_arabic("九百九十九")           # 输出:999
chinese_to_arabic("五萬三千")             # 输出:53000

为什么能解决你的问题?

  1. 分级处理:把大单位作为分割点,避免了「兆」和「萬」这类跨量级单位的直接计算冲突,每个模块独立计算后再累加,逻辑更清晰。
  2. 兼容省略规则:处理了「十」「百」这类省略开头数字的场景,符合中文数字的使用习惯。
  3. 可扩展性:如果需要添加更大的单位(如京、垓),只需要在scale_large里新增映射即可,无需修改核心逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:36