Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中将Unicode数字转换为整数_Ruby_Regex_Ruby On Rails 4_Unicode - Fatal编程技术网

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

在Ruby中将Unicode数字转换为整数,ruby,regex,ruby-on-rails-4,unicode,Ruby,Regex,Ruby On Rails 4,Unicode,不幸的是,我有一些使用非ASCII数字的字符串。我需要将它们转换成规则的Ruby数,对它们进行一些数学运算。因此,例如,如果数字作为字符串“۱۹”输入,它是19,但作为字符“扩展阿拉伯-印度数字1”后跟“扩展阿拉伯-印度数字9”,我需要一种方法将其转换为Ruby整数Fixnum 19 问题是,这些扩展数字中有55组0-9个,即我需要处理的总共550个代码点 我已经知道,对于给定的组,连续数字的码点是连续的,因此,例如,扩展的阿拉伯-印度数字0是U+06F0,扩展的阿拉伯-印度数字9是U+06F9

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

问题是,这些扩展数字中有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]

谢谢@Amadan,看起来会很好用的。我不必输入55个范围,但我仍然需要输入55个零。我能做的就是。。。但是有没有其他方法可以让我不用输入55个零呢?宝石还是其他魔法?@CarySwoveland
“0123456789”*altzeros.size
确保两个字符串具有相同的大小size@Stefan哦,我明白了。谢谢。你也可以创建一个替换哈希值
hash={'1',…,'۹'=>9}
,并通过
“۱۹”.gsub(/[:digital:]/,hash)
替换数字。我希望Twitter I18N gem
Twitter_cldr
会有内置的功能,但找不到任何方法来实现这一点。还有人想核实一下吗?