在 Go 中解析 unicode 数字

Parse unicode digits in Go

其他答案提到使用 unicode.IsDigit() 来检查给定的符文是否是数字,但我如何弄清楚 是哪个 数字呢?

来自 strconv 的 Atoi 和 ParseInt 不会解析它。

IsDigit 检查一个 table,其中包含所有 these codepoints,但我无法从中找出任何东西。许多数字范围以 0 结尾的代码点处的 0 数字开头,但不是全部,所以我不能只是 char & 0xF.

我唯一的其他想法是是否有办法访问符文的 unicode 名称,或者是否可以访问属性。每个数字 unicode 字符(甚至分数)似乎都有一个与之关联的纯 ASCII 数字 behind the scenes 作为 属性,但我似乎无法找到一种方法来访问该信息或名称(例如,所有 unicode 数字的名称都以“DIGIT ZERO”结尾)。我 looking/building 在这个标准库之外吗?

使用 runenames 包根据名称识别数字。

这不是标准库包,但它是 golang.org/x/

的一部分

These packages are part of the Go Project but outside the main Go tree. They are developed under looser compatibility requirements than the Go core. Install them with "go get".

import (
    "golang.org/x/text/unicode/runenames"

    "fmt"
    "strings"
)

func whatDigit(digit rune) int {
    var name = runenames.Name(digit)
    switch {
    case strings.Contains(name, "DIGIT ZERO"):
        return 0
    case strings.Contains(name, "DIGIT ONE"):
        return 1
    case strings.Contains(name, "DIGIT TWO"):
        return 2
    case strings.Contains(name, "DIGIT THREE"):
        return 3
    case strings.Contains(name, "DIGIT FOUR"):
        return 4
    case strings.Contains(name, "DIGIT FIVE"):
        return 5
    case strings.Contains(name, "DIGIT SIX"):
        return 6
    case strings.Contains(name, "DIGIT SEVEN"):
        return 7
    case strings.Contains(name, "DIGIT EIGHT"):
        return 8
    case strings.Contains(name, "DIGIT NINE"):
        return 9
    default:
        return -1
    }

    return 0
}

该软件包确实提到了一个文档 https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt,该文档似乎包含每个字符的更多信息,包括指定该字符在纯 ASCII 中的数字,但是,该软件包仅提供名称。仅查看文档,名称似乎遵循 whatDigit 函数中显示的模式。