From de6e3ba5a0ca8faaae37d44b61f93f89b53bb4e0 Mon Sep 17 00:00:00 2001 From: qhwa Date: Mon, 17 Mar 2014 15:18:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=9E=E7=BB=AD=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ chinese_number.gemspec | 4 ++-- lib/chinese_number/parser.rb | 10 +++++++++- spec/parser_spec.rb | 8 +++++++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aadaf87..9087f33 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,9 @@ You can use the top-level api: ~~~ruby ChinseNumber.trans "我有十块钱" #=> "我有10块钱" + +ChinseNumber.trans "二〇一四年" +#=> "2014年" ~~~ or use the standalone parser: diff --git a/chinese_number.gemspec b/chinese_number.gemspec index f442313..af18c8a 100644 --- a/chinese_number.gemspec +++ b/chinese_number.gemspec @@ -8,8 +8,8 @@ Gem::Specification.new do |spec| spec.version = ChineseNumber::VERSION spec.authors = ["qhwa"] spec.email = ["qhwa@163.com"] - spec.summary = %q{TODO: Write a short summary. Required.} - spec.description = %q{TODO: Write a longer description. Optional.} + spec.summary = %q{Translate Chinese numbers into Arabic numbers} + spec.description = %q{This ruby gem translate Chinse numbers into Arabic numbers. e.g. “一十” => 10.} spec.homepage = "" spec.license = "MIT" diff --git a/lib/chinese_number/parser.rb b/lib/chinese_number/parser.rb index c4167a4..fe52077 100644 --- a/lib/chinese_number/parser.rb +++ b/lib/chinese_number/parser.rb @@ -34,6 +34,14 @@ def self.generate_multipers_map TOKEN = Regexp.new( "[#{(DIGIT_MAP.keys + MULTIPERS.keys).join}]+" ) def parse word + + raise InvalidWord unless word =~ /\A#{TOKEN}\Z/ + + # 类似“二零一二” 这种短语,可以直接拼数字返回 + unless word =~ MULTIPER_TOKEN + return word.gsub(/\S/) {|w| DIGIT_MAP[w]}.to_i + end + @scanner = StringScanner.new( word ) parts = [] @@ -83,7 +91,7 @@ def to_i end end - class UnexpectToken < RuntimeError + class InvalidWord < RuntimeError end end diff --git a/spec/parser_spec.rb b/spec/parser_spec.rb index 550f6f0..2f1058b 100644 --- a/spec/parser_spec.rb +++ b/spec/parser_spec.rb @@ -6,6 +6,12 @@ @parser = ChineseNumber::Parser.new end + it '可以解析连续的数字' do + test '一二三', 123 + test '二零一二', 2012 + test '二〇一二', 2012 + end + it '可以解析个位数字' do test '零', 0 test '〇', 0 @@ -82,7 +88,7 @@ it '对于不合法的文字抛出错误' do expect { @parser.parse('没有数字').should - }.to raise_error( ChineseNumber::Parser::UnexpectToken ) + }.to raise_error( ChineseNumber::Parser::InvalidWord ) end def test word, expect_digit