Joe*_*oel 4 ruby regex unicode ruby-on-rails-4
不幸的是,我有一些数字作为字符串使用非ASCII数字.我需要将它们转换为常规的Ruby数字来对它们进行一些数学运算.因此,例如,如果数字作为字符串"19"进来,这是19,但作为字符"扩展阿拉伯语数字一"后跟"扩展阿拉伯语数字九",我需要一种方法将其转换为Ruby整数Fixnum 19.
问题是,根据这个,有55组这些扩展数字的0-9,即我需要处理550个总代码点.
我已经知道,对于给定的组,连续数字的代码点是连续的,例如扩展的阿拉伯语数字0是U + 06F0,扩展的阿拉伯语数字9是U + 06F9,所以我可以测试每个数字以查看哪个范围它在,然后从我正在查看的字符的代码点中减去零代码点作为整数,给我常规的Ruby整数.例如,6F9 - 6F0 = 9(粗略地说,一旦它们被转换为整数代码点).
但要做到这一点,我需要为这55个范围创建一个巨大的查找哈希,这就是很多打字.我想我可以将上面链接中的HTML表格翻译成红宝石地图,但这感觉很糟糕.
我已经知道了
"??" =~ /[[:digit:]]+/
Run Code Online (Sandbox Code Playgroud)
将是匹配,但问题是"如何将这些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 ???"
str.scan(/[[:digit:]]+/).map do |s|
DecimalToIntegerConverter.convert(s)
end
# => [19, 25]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |