data = /(?<m>.天.*晚)/.match('今天二十晚')
result = /(?<m>.十.)/.match(data[:m])
# '几'
if result.nil?
result = data[:m]
nights = Application.config.cn[result[2]]
elsif result[:m][0] == '天'
# 十几
nights = Application.config.cn[result[:m].slice(2)].to_i + 10
else
# '几十几'
if result[:m][2] != '晚'
nights = Application.config.cn[result[:m].slice(0)].to_i * 10 +
Application.config.cn[result[:m].slice(2)].to_i
else
# '几十'
nights = Application.config.cn[result[:m].slice(0)].to_i * 10
end
end
---------------------
config.cn = {
'一' => 1,
'二' => 2,
'三' => 3,
'四' => 4,
'五' => 5,
'六' => 6,
'七' => 7,
'八' => 8,
'九' => 9,
'十' => 10
}
自己写的一个简单的方法,求教各位,各种优雅的实现。
一行代码
12345.to_s.gsub(/./).each_with_index.map { |number, index| ['零一二三四五六七八九'[number.to_i], '个十百千万'.reverse[index]] }.flatten.join # => "一万二千三百四十五个"
'一万二千三百四十五个'.delete('个十百千万').chars.map { |char| '零一二三四五六七八九'.chars.index(char) }.join.to_i # => 12345
很奇怪没有找到这样的 gem,所以刚写了一个: https://github.com/qhwa/chinse_number
require 'chinese_number'
ChineseNumber.trans '今天二十万'
#=> "今天200000"
ChineseNumber.extract "今天二十晚"
#=> [20]
ChineseNumber::Parser.new.parse '二零一四'
#=> 2014
ChineseNumber::Parser.new.parse '一万三千'
#=> 13000
#19 楼 @glz1992
明白 extend
就明白 extend self
了,建议看一下《Ruby 元编程》,我尝试解释一下
extend
是一个快捷方式:
module B
def foo; "bar"; end
end
module A
extend B
end
A.foo
#=> "bar"
# 等效于
...
module A
class << self
include B
end
end
A.foo
#=> "bar"
可以看到, extend
是向类的 singleton class 里面引入模块。
extend self
就是往自己的 singleton class 里面引入自己
module B
def foo; "bar"; end
end
# 以下几个版本是一致的:
# Version 0
module B
def self.foo
"bar"
end
end
# Version 1
module B
extend self
end
# Version 2
module B
class << self
include B
end
end
# -------------------
B.foo
#=> "bar"
extend self
就是一种简写再简写
很有意思的需求。
给一个 丑陋
的实现。
require 'minitest/autorun'
require 'minitest/pride'
describe "应该替换为正确的数字" do
specify { "这个数字是三十".convert_to_number.must_equal '这个数字是30' }
specify { "五, 是一个数字".convert_to_number.must_equal '5, 是1个数字' }
specify { "这是十三".convert_to_number.must_equal '这是13' }
specify { "返回三十五".convert_to_number.must_equal '返回35' }
end
class String
def convert_to_number
hash_map = Hash.new {|h,k| h[k] = k }
hash_map.merge!({
'一' => 1,
'二' => 2,
'三' => 3,
'四' => 4,
'五' => 5,
'六' => 6,
'七' => 7,
'八' => 8,
'九' => 9,
'零' => 0,
})
gsub(/(?u)\w/,hash_map).gsub(/(?<=\d)十(?=\d)/, '').gsub(/十(?=\d)/, '1').gsub(/(?<=\d)十/, '0')
end
end