Golang实现将数字单词转换为数值的方法

Golang实现将数字单词转换为数值的方法 你好, 有没有现成的包或代码片段可以帮助我将数字单词转换为数值? 示例: “two million three thousand nine hundred and eighty four” 转换为 “2003984” “twenty one” 转换为 “21” 等等 提前感谢

2 回复

我不确定是否存在这样的工具,但我的猜测是你可以使用 num2words 来帮助你编写反向实现。

更多关于Golang实现将数字单词转换为数值的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,可以通过自定义函数实现将数字单词转换为数值。以下是一个完整的示例代码,它支持从"zero"到"billion"的数字单词转换,包括复合数字(如"twenty one")和大型数字(如"two million")。

package main

import (
	"fmt"
	"strings"
)

var smallNumbers = map[string]int64{
	"zero": 0, "one": 1, "two": 2, "three": 3, "four": 4,
	"five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9,
	"ten": 10, "eleven": 11, "twelve": 12, "thirteen": 13, "fourteen": 14,
	"fifteen": 15, "sixteen": 16, "seventeen": 17, "eighteen": 18, "nineteen": 19,
	"twenty": 20, "thirty": 30, "forty": 40, "fifty": 50,
	"sixty": 60, "seventy": 70, "eighty": 80, "ninety": 90,
}

var largeNumbers = map[string]int64{
	"hundred":  100,
	"thousand": 1000,
	"million":  1000000,
	"billion":  1000000000,
}

func wordsToNumber(words []string) int64 {
	var total, current int64
	for _, word := range words {
		if num, exists := smallNumbers[word]; exists {
			current += num
		} else if num, exists := largeNumbers[word]; exists {
			if word == "hundred" {
				current *= num
			} else {
				current *= num
				total += current
				current = 0
			}
		}
	}
	return total + current
}

func convertNumberWords(input string) int64 {
	words := strings.Fields(strings.ToLower(input))
	return wordsToNumber(words)
}

func main() {
	examples := []string{
		"two million three thousand nine hundred and eighty four",
		"twenty one",
		"one hundred and five",
		"five thousand two hundred",
		"one million",
	}

	for _, example := range examples {
		cleaned := strings.ReplaceAll(example, " and ", " ")
		result := convertNumberWords(cleaned)
		fmt.Printf("'%s' -> %d\n", example, result)
	}
}

运行结果:

'two million three thousand nine hundred and eighty four' -> 2003984
'twenty one' -> 21
'one hundred and five' -> 105
'five thousand two hundred' -> 5200
'one million' -> 1000000

代码说明:

  1. 定义了两个映射表:smallNumbers处理基本数字(0-90),largeNumbers处理数量级单位(百、千、百万等)
  2. wordsToNumber函数遍历单词列表,累计计算数值
  3. 处理"and"连接词时,在输入中将其替换为空格
  4. 支持复合数字的解析,如"twenty one"会被正确解析为21

这个实现可以处理大多数常见的数字单词表达形式,对于更复杂的用例可以进一步扩展映射表和处理逻辑。

回到顶部