zen_to_i 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 53867a13f9fae7bc43db15f95836a223ffe980d5
4
- data.tar.gz: 10748a96c6d837e14637bc40a05d8461e6ce8499
2
+ SHA256:
3
+ metadata.gz: 3839de0a246d873410c9acd82dc4d4317c08112c12c9e3593e847cc61b6fff80
4
+ data.tar.gz: 79de8b4c92b8c373b3c0d10ae46e381cd265d5579630206302b59b571d5feeb8
5
5
  SHA512:
6
- metadata.gz: b414e37deb0dcedaa7e7521038fa4aa5ed5842796b7d1ae951789b3781c37eb00681e9863733db9b97f1cf2cda5d82bbe7a112479b0ff26b89bedb1116244c45
7
- data.tar.gz: 234124278855d5f4f70b982f3c18644fbb8e437013b9c59de39f526f89b2e64e75cbf5e16338763b2b99cd83dea237b680b506151f10366905d81fa6718ff1c7
6
+ metadata.gz: 7ad359f8a19fc3ec4db4e9cb0be5d589a7405f2b7d35f234326991f0ea0a939525f1e31f6140748939d70b86a9928bac17e4ff3cec2a3c0a1f90b21dad32a52f
7
+ data.tar.gz: 5253f8272185f802f772b5145923e842236690324e69c5623c468fed4420c0cdb85c5c432ea285b09c6b920ea1c3eee7229e200963ad09a193a289b30ddf833e
data/.rubocop.yml ADDED
@@ -0,0 +1,6 @@
1
+ inherit_gem:
2
+ onkcop:
3
+ - "config/rubocop.yml"
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.4
data/.travis.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3.1
4
- - 2.2.4
5
- - 2.1.0
3
+ - 2.6.3
4
+ - 2.5.5
5
+ - 2.4.6
6
6
  script: bundle exec rspec
data/Gemfile CHANGED
@@ -1,6 +1,3 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
- gem 'rspec'
4
-
5
- # Specify your gem's dependencies in zen_to_i.gemspec
6
3
  gemspec
data/README.md CHANGED
@@ -6,21 +6,38 @@
6
6
 
7
7
  ## Installation
8
8
 
9
- Add this line to your application's Gemfile:
9
+ install via rubygems
10
10
 
11
- gem 'zen_to_i'
11
+ $ gem install zen_to_i
12
+
13
+ Or, you can use bundler. Please add this line to your application's Gemfile:
14
+
15
+ ```ruby:Gemfile
16
+ gem 'zen_to_i'
17
+ ```
12
18
 
13
19
  And then execute:
14
20
 
15
21
  $ bundle
16
22
 
17
- Or install it yourself as:
23
+ ## Usage
18
24
 
19
- $ gem install zen_to_i
25
+ ## 1. You can use `zen_to_i` command from your shell
20
26
 
21
- ## Usage
27
+ $ zen_to_i "一二三"
28
+ 123
29
+
30
+ # or you can use with pipe
31
+ $ echo "一二三" | zen_to_i
32
+ 123
33
+
34
+ Please call `bundle exec zen_to_i` if you install this gem via bundler.
35
+
36
+ ### 2. In your Ruby script
22
37
 
23
38
  ```ruby
39
+ require 'zen_to_i'
40
+
24
41
  "hoge".zen_to_i
25
42
  #=> "hoge"
26
43
 
@@ -33,6 +50,36 @@ Or install it yourself as:
33
50
  "三兆五十二万四十八".zen_to_i
34
51
  #=> "3000000520048"
35
52
  ```
53
+ Note that `zen_to_i` returns String, not Integer.
54
+
55
+ Or you can overwrite `to_i` method with Refinements.
56
+ This returns Integer same as default `to_i` method.
57
+
58
+ ```ruby
59
+ require "zen_to_i/refine"
60
+
61
+ using ZenToI::Refine
62
+
63
+ "一二三".zen_to_i
64
+ #=> "103"
65
+
66
+ "一二三".to_i
67
+ #=> 103
68
+ ```
69
+
70
+ Also, you can implicitly overwrite `to_i` method by `require "zen_to_i/string_ext"`.
71
+ Of course it is very dangerous. Please be careful to use it.
72
+
73
+ ```ruby
74
+ require "zen_to_i/string_ext"
75
+
76
+ "一二三".zen_to_i
77
+ #=> "103"
78
+
79
+ "一二三".to_i
80
+ #=> 103
81
+ ```
82
+
36
83
 
37
84
  ## Contributing
38
85
 
data/bin/zen_to_i ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Signal.trap("INT") { abort }
4
+
5
+ require "zen_to_i"
6
+
7
+ begin
8
+ if $stdin.tty?
9
+ if ARGV.length == 1
10
+ puts ARGV[0].zen_to_i
11
+ else
12
+ warn "Usage: zen_to_i (string)"
13
+ exit 1
14
+ end
15
+ else
16
+ $stdin.each_line do |l|
17
+ puts l.zen_to_i
18
+ end
19
+ end
20
+ rescue => e
21
+ warn e.inspect
22
+ e.backtrace.each do |t|
23
+ warn " #{t}"
24
+ end
25
+ exit 2
26
+ end
@@ -1,15 +1,18 @@
1
- # encoding: utf-8
2
- class String
3
- module Zen2Num
4
- KANNUM = { '〇' => 0, '' => 1, '一' => 1, '二' => 2, '三' => 3, '四' => 4,
5
- '五' => 5, '六' => 6, '七' => 7, '八' => 8, '九' => 9,
6
- '零' => 0, '壱' => 1, '弐' => 2, '参' => 3, '肆' => 4,
7
- '伍' => 5, '陸' => 6, '漆' => 7, '捌' => 8, '玖' => 9 }.freeze
8
- KANORDER = { '十' => 10, '百' => 100, '千' => 1000, '' => 1, '拾' => 10,
9
- '陌' => 100, '佰' => 100, '阡' => 1000, '仟' => 1000 }.freeze
10
- KANORDER_F = { '万' => 10**4, '億' => 10**8, '兆' => 10**12,
11
- '' => 1, '萬' => 10**4 }.freeze
1
+ # frozen_string_literal: true
2
+
3
+ module ZenToI
4
+ module Constant
5
+ KANNUM = { "〇" => 0, "" => 1, "一" => 1, "二" => 2, "三" => 3, "四" => 4,
6
+ "五" => 5, "六" => 6, "七" => 7, "八" => 8, "九" => 9,
7
+ "零" => 0, "壱" => 1, "弐" => 2, "参" => 3, "肆" => 4,
8
+ "伍" => 5, "陸" => 6, "漆" => 7, "捌" => 8, "玖" => 9 }.freeze
9
+ KANORDER = { "十" => 10, "百" => 100, "千" => 1000, "" => 1, "拾" => 10,
10
+ "陌" => 100, "佰" => 100, "阡" => 1000, "仟" => 1000 }.freeze
11
+ KANORDER_F = { "万" => 10**4, "億" => 10**8, "兆" => 10**12,
12
+ "" => 1, "萬" => 10**4 }.freeze
12
13
  ALL_KANSUUJI = KANNUM.keys + KANORDER.keys + KANORDER_F.keys
13
14
  MAX_LOOP = 100
14
- end
15
+ KANORDER_F_KEYS_REGEX = /([^#{KANORDER_F.keys.join('')}]*)([#{KANORDER_F.keys.join('')}]?)/.freeze
16
+ KANORDER_KEYS_REGEX = /([^#{KANORDER.keys.join('')}]*)([#{KANORDER.keys.join('')}]?)/.freeze
17
+ end.freeze
15
18
  end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "./constant"
4
+
5
+ module ZenToI
6
+ module Mixin
7
+ include ::ZenToI::Constant
8
+
9
+ def zen_to_i
10
+ result = kanji2num(self)
11
+ zen2han(result)
12
+ end
13
+
14
+ private
15
+
16
+ def kanji2num(str)
17
+ array = split_kansuuji(str)
18
+ array = split_kansuuji_detail(array)
19
+ result = convert_kansuuji(array)
20
+ result.join("")
21
+ end
22
+
23
+ def zen2han(str)
24
+ str.tr("0-9", "0-9")
25
+ end
26
+
27
+ # 漢数字のところだけ切り出す
28
+ def split_kansuuji(string)
29
+ string.split(/([#{ALL_KANSUUJI.join('')}]+)/)
30
+ end
31
+
32
+ # 位を表す数ではない普通の漢数字が続いていたらわける
33
+ def split_kansuuji_detail(array)
34
+ array_tmp = array.clone
35
+ array_result = array.clone
36
+ (1..MAX_LOOP).each do |_i|
37
+ array_result = split_kansuuji_detail_inner(array_result)
38
+ return array_result if array_result == array_tmp
39
+
40
+ array_tmp = array_result.clone
41
+ end
42
+ array_result
43
+ end
44
+
45
+ def split_kansuuji_detail_inner(array)
46
+ ary = array.map do |a|
47
+ if /([#{ALL_KANSUUJI.join('')}]+)/.match?(a)
48
+ kannum = KANNUM.keys.join("")
49
+ a.gsub(/([#{kannum}])([#{kannum}])/, '\1,\2').split(",")
50
+ else
51
+ a
52
+ end
53
+ end
54
+ ary.flatten
55
+ end
56
+
57
+ # 4桁ごとの単位(万、億、兆など)でまずわけ、
58
+ # それぞれに対して漢数字→数字を実行している。
59
+ def convert_kansuuji(array)
60
+ array.map do |a|
61
+ if /([#{ALL_KANSUUJI.join('')}]+)/.match?(a)
62
+ a.scan(KANORDER_F_KEYS_REGEX).inject(0) do |ret, (unit, order_f)|
63
+ unit_i = unit.scan(KANORDER_KEYS_REGEX).inject(-1) do |tmp, (kanji, order)|
64
+ tmp + KANNUM[kanji].to_i * KANORDER[order].to_i
65
+ end
66
+ ret + unit_i * KANORDER_F[order_f].to_i
67
+ end
68
+ else
69
+ a
70
+ end
71
+ end
72
+ end
73
+
74
+ def format_location(string)
75
+ location_map.each do |key, value|
76
+ string.gsub!(/#{key}/, value)
77
+ end
78
+ string
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../zen_to_i"
4
+
5
+ module ZenToI::Refine
6
+ refine String do
7
+ alias_method :_to_i, :to_i
8
+
9
+ def to_i
10
+ self.zen_to_i._to_i
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../zen_to_i"
4
+
5
+ class String
6
+ alias_method :_to_i, :to_i
7
+
8
+ def to_i
9
+ self.zen_to_i._to_i
10
+ end
11
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ZenToI
2
- VERSION = "0.0.2"
4
+ VERSION = "0.1.0"
3
5
  end
data/lib/zen_to_i.rb CHANGED
@@ -1,85 +1,7 @@
1
- # coding: utf-8
2
- require 'zen_to_i/version'
3
- require 'zen_to_i/constant'
1
+ # frozen_string_literal: true
4
2
 
5
- class String
6
- module Zen2Num
7
- def zen_to_i
8
- result = kanji2num(self)
9
- zen2han(result)
10
- end
11
-
12
- def kanji2num(string)
13
- array = split_kansuuji(string)
14
- array = split_kansuuji_detail(array)
15
- result = convert_kansuuji(array)
16
- result.join('')
17
- end
18
-
19
- def zen2han str
20
- str.tr("0-9","0-9")
21
- end
22
-
23
- private
24
-
25
- #漢数字のところだけ切り出す
26
- def split_kansuuji(string)
27
- string.split(/([#{ALL_KANSUUJI.join('')}]+)/)
28
- end
29
-
30
- #位を表す数ではない普通の漢数字が続いていたらわける
31
- def split_kansuuji_detail(array)
32
- array_tmp = array.clone
33
- array_result = array.clone
34
- (1..MAX_LOOP).each{|i|
35
- array_result = split_kansuuji_detail_inner(array_result)
36
- if array_result == array_tmp
37
- return array_result
38
- else
39
- array_tmp = array_result.clone
40
- end
41
- }
42
- array_result
43
- end
44
-
45
- def split_kansuuji_detail_inner(array)
46
- array.map{|a|
47
- if( a =~ /([#{ALL_KANSUUJI.join('')}]+)/)
48
- kannum = KANNUM.keys.join('')
49
- a.gsub(/([#{kannum}])([#{kannum}])/,'\1,\2').split(",")
50
- else
51
- a
52
- end
53
- }.flatten
54
- end
3
+ require "zen_to_i/mixin"
55
4
 
56
- # 4桁ごとの単位(万、億、兆など)でまずわけ、
57
- # それぞれに対して漢数字→数字を実行している。
58
- def convert_kansuuji(array)
59
- array.map{|a|
60
- if( a =~ /([#{ALL_KANSUUJI.join('')}]+)/)
61
- reg_order_f = /([^#{KANORDER_F.keys.join('')}]*)([#{KANORDER_F.keys.join('')}]?)/
62
- a.scan( reg_order_f ).inject(0) do |ret, (lt_1000, order_f)|
63
- reg_order = /([^#{KANORDER.keys.join('')}]*)([#{KANORDER.keys.join('')}]?)/
64
- lt_1000_i = lt_1000.scan( reg_order ).inject(-1) do |tmp, (_1_9, order)|
65
- tmp + KANNUM[_1_9].to_i * KANORDER[order].to_i
66
- end
67
- ret + lt_1000_i * KANORDER_F[order_f].to_i
68
- end
69
- else
70
- a
71
- end
72
- }
73
- end
74
-
75
-
76
- def format_location string
77
- location_map.each{|key,value|
78
- string.gsub!(/#{key}/,value)
79
- }
80
- string
81
- end
82
-
83
- end
84
- include Zen2Num
5
+ class String
6
+ include ZenToI::Mixin
85
7
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zen_to_i/refine"
4
+
5
+ using ZenToI::Refine
6
+
7
+ describe ZenToI::Refine do
8
+ describe "String#to_i refined" do
9
+ it "usingを使っていると漢数字は変換できる" do
10
+ expect("一二三".to_i).to eq 123
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zen_to_i/string_ext"
4
+
5
+ describe String do
6
+ describe "#to_i overwritten" do
7
+ it "to_iで漢数字変換ができる" do
8
+ expect("一二三".to_i).to eq 123
9
+ end
10
+ end
11
+ end
@@ -1,8 +1,9 @@
1
- # coding: utf-8
2
- require File.dirname(__FILE__)+"/../spec_helper"
1
+ # frozen_string_literal: true
2
+
3
+ require "zen_to_i"
3
4
 
4
5
  describe ZenToI do
5
- describe "String#zen_to_i" do
6
+ describe "String#zen_to_i" do
6
7
  it "数字以外の文字の場合はそのまま返す" do
7
8
  expect("hoge".zen_to_i).to eq "hoge"
8
9
  end
@@ -22,6 +23,5 @@ describe ZenToI do
22
23
  it "大字でも変換可能" do
23
24
  expect("肆佰参拾捌".zen_to_i).to eq "438"
24
25
  end
25
-
26
26
  end
27
27
  end
data/zen_to_i.gemspec CHANGED
@@ -1,23 +1,26 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("lib", __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'zen_to_i/version'
3
+ require "zen_to_i/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = "zen_to_i"
8
7
  spec.version = ZenToI::VERSION
9
8
  spec.authors = ["yoshitsugu"]
10
9
  spec.email = ["zeroinon1206bass@gmail.com"]
11
- spec.description = %q{全角文字に含まれる数字を半角の数値に変換。兆まで対応}
12
- spec.summary = %q{Japanese zenkaku to number}
10
+ spec.description = "全角文字に含まれる数字を半角の数値に変換。兆まで対応"
11
+ spec.summary = "Japanese zenkaku to number"
13
12
  spec.homepage = ""
14
13
  spec.license = "MIT"
14
+ spec.required_ruby_version = ">= 2.4.6"
15
15
 
16
- spec.files = `git ls-files`.split($/)
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
+ spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "onkcop"
23
+ spec.add_development_dependency "pry"
22
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
23
26
  end
metadata CHANGED
@@ -1,29 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zen_to_i
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshitsugu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-07 00:00:00.000000000 Z
11
+ date: 2019-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: onkcop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
18
46
  - !ruby/object:Gem::Version
19
- version: '1.3'
47
+ version: '0'
20
48
  type: :development
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
- - - "~>"
52
+ - - ">="
25
53
  - !ruby/object:Gem::Version
26
- version: '1.3'
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rake
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -38,24 +66,45 @@ dependencies:
38
66
  - - ">="
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
41
83
  description: 全角文字に含まれる数字を半角の数値に変換。兆まで対応
42
84
  email:
43
85
  - zeroinon1206bass@gmail.com
44
- executables: []
86
+ executables:
87
+ - zen_to_i
45
88
  extensions: []
46
89
  extra_rdoc_files: []
47
90
  files:
48
91
  - ".gitignore"
92
+ - ".rubocop.yml"
49
93
  - ".travis.yml"
50
94
  - Gemfile
51
95
  - LICENSE.txt
52
96
  - README.md
53
97
  - Rakefile
98
+ - bin/zen_to_i
54
99
  - lib/zen_to_i.rb
55
100
  - lib/zen_to_i/constant.rb
101
+ - lib/zen_to_i/mixin.rb
102
+ - lib/zen_to_i/refine.rb
103
+ - lib/zen_to_i/string_ext.rb
56
104
  - lib/zen_to_i/version.rb
57
- - spec/lib/zen_to_i_spec.rb
58
- - spec/spec_helper.rb
105
+ - spec/refine_spec.rb
106
+ - spec/string_ext_spec.rb
107
+ - spec/zen_to_i_spec.rb
59
108
  - zen_to_i.gemspec
60
109
  homepage: ''
61
110
  licenses:
@@ -69,18 +118,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
69
118
  requirements:
70
119
  - - ">="
71
120
  - !ruby/object:Gem::Version
72
- version: '0'
121
+ version: 2.4.6
73
122
  required_rubygems_version: !ruby/object:Gem::Requirement
74
123
  requirements:
75
124
  - - ">="
76
125
  - !ruby/object:Gem::Version
77
126
  version: '0'
78
127
  requirements: []
79
- rubyforge_project:
80
- rubygems_version: 2.5.1
128
+ rubygems_version: 3.0.3
81
129
  signing_key:
82
130
  specification_version: 4
83
131
  summary: Japanese zenkaku to number
84
132
  test_files:
85
- - spec/lib/zen_to_i_spec.rb
86
- - spec/spec_helper.rb
133
+ - spec/refine_spec.rb
134
+ - spec/string_ext_spec.rb
135
+ - spec/zen_to_i_spec.rb
data/spec/spec_helper.rb DELETED
@@ -1,2 +0,0 @@
1
- # coding: utf-8
2
- require File.dirname(__FILE__)+"/../lib/zen_to_i"