gpt4 book ai didi

ruby - 在 Ruby 中将 Unicode 数字转换为整数

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:01 25 4
gpt4 key购买 nike

不幸的是,我有一些数字作为字符串使用非 ASCII 数字输入。我需要将它们转换为常规 Ruby 数字,以便对它们进行一些数学运算。因此,例如,如果出现数字字符串“19”,即 19,但作为字符“扩展阿拉伯印度数字一”后跟“扩展阿拉伯印度数字九”,我需要一种方法将其转换为Ruby 整数 Fixnum 19。

问题是,according to this ,这些扩展数字有 55 组 0-9,即我需要处理的总共 550 个代码点。

我已经知道对于给定的组,连续数字的代码点是连续的,因此例如扩展阿拉伯印度数字 0 是 U+06F0,扩展阿拉伯印度数字 9 是 U+06F9,所以我可以测试每个数字查看它在哪个范围内,然后从我正在查看的字符的代码点中减去作为整数的零代码点,得到常规的 Ruby 整数。例如,6F9 - 6F0 = 9(粗略地说,一旦将它们转换为整数代码点)。

但要做到这一点,我需要为这 55 个范围创建一个巨大的查找散列,这需要大量的输入。我想我可以将上面链接中的 HTML 表翻译成 ruby​​ 映射,但这感觉很糟糕。

我已经知道了

"۱۹" =~ /[[:digit:]]+/

将匹配,但问题是“如何将这些 Unicode 数字转换回常规 Ruby 整数?”

必须有更好的方法!有什么想法吗?

谢谢!

最佳答案

这相对没有痛苦。

class DecimalToIntegerConverter
altzeros = [0x06f0, 0xff10] # ... need all zeroes here
@@digits = altzeros.flat_map { |z| ((z.chr(Encoding::UTF_8))..((z+9).chr(Encoding::UTF_8))).to_a }.join('')
@@replacements = "0123456789" * altzeros.size
def self.convert(str)
str.tr(@@digits, @@replacements).to_i
end
end

str = "۱۹ and 25?"
str.scan(/[[:digit:]]+/).map do |s|
DecimalToIntegerConverter.convert(s)
end
# => [19, 25]

关于ruby - 在 Ruby 中将 Unicode 数字转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37338708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com