zen_to_i 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3839de0a246d873410c9acd82dc4d4317c08112c12c9e3593e847cc61b6fff80
4
- data.tar.gz: 79de8b4c92b8c373b3c0d10ae46e381cd265d5579630206302b59b571d5feeb8
3
+ metadata.gz: b7159a12adbda141423184a4769d10011e872607f7504df9f10ff47146d25880
4
+ data.tar.gz: 8b34203aaad6483c34acf49d7f7e3b07972a0dec470a56cfef3598156c9ab22d
5
5
  SHA512:
6
- metadata.gz: 7ad359f8a19fc3ec4db4e9cb0be5d589a7405f2b7d35f234326991f0ea0a939525f1e31f6140748939d70b86a9928bac17e4ff3cec2a3c0a1f90b21dad32a52f
7
- data.tar.gz: 5253f8272185f802f772b5145923e842236690324e69c5623c468fed4420c0cdb85c5c432ea285b09c6b920ea1c3eee7229e200963ad09a193a289b30ddf833e
6
+ metadata.gz: 66e00c3a2e43a09b7cf8e8cfa78d504fd798a8403c1f787ad4e03f7a34bd1ff05d2ac4033e80405cba4fe0a8b77c09c4fca7b656751c912ea067789f81ba0a56
7
+ data.tar.gz: e2a84957f2e08f246c001bbfd94b4bfc1e1bbe56d2a8a1c21a51d14684d072e394060a912be352ca6a938140975b8dd79c3aeeea888abebb9e431dbddea36042
data/README.md CHANGED
@@ -1,39 +1,38 @@
1
1
  # ZenToI
2
- 兆までの漢数字を半角数字に変換します。
3
- 漢数字が続いていたらそれぞれ変換します。
2
+ 兆までの漢数字を半角数字に変換します。文章中に含まれる漢数字も変換できます。
4
3
 
5
- [![Build Status](https://travis-ci.org/yoshitsugu/zen_to_i.svg)](https://travis-ci.org/yoshitsugu/zen_to_i)
4
+ [![Actions Status](https://github.com/yoshitsugu/zen_to_i/workflows/test/badge.svg)](https://github.com/yoshitsugu/zen_to_i/actions)
6
5
 
7
6
  ## Installation
8
7
 
9
- install via rubygems
8
+ Install via RubyGems.
10
9
 
11
10
  $ gem install zen_to_i
12
11
 
13
- Or, you can use bundler. Please add this line to your application's Gemfile:
12
+ Or, use Bundler. Add this line to your application's Gemfile:
14
13
 
15
- ```ruby:Gemfile
16
- gem 'zen_to_i'
14
+ ```ruby
15
+ gem "zen_to_i"
17
16
  ```
18
17
 
19
- And then execute:
18
+ Then run:
20
19
 
21
20
  $ bundle
22
21
 
23
22
  ## Usage
24
23
 
25
- ## 1. You can use `zen_to_i` command from your shell
24
+ ### 1. Use the `zen_to_i` command from your shell
26
25
 
27
26
  $ zen_to_i "一二三"
28
27
  123
29
28
 
30
- # or you can use with pipe
29
+ # or use a pipe
31
30
  $ echo "一二三" | zen_to_i
32
31
  123
33
32
 
34
- Please call `bundle exec zen_to_i` if you install this gem via bundler.
33
+ Please run `bundle exec zen_to_i` if you installed the gem via Bundler.
35
34
 
36
- ### 2. In your Ruby script
35
+ ### 2. Use it in your Ruby script
37
36
 
38
37
  ```ruby
39
38
  require 'zen_to_i'
@@ -50,10 +49,9 @@ require 'zen_to_i'
50
49
  "三兆五十二万四十八".zen_to_i
51
50
  #=> "3000000520048"
52
51
  ```
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.
52
+ Note that `zen_to_i` returns a String, not an Integer.
53
+
54
+ You can also override `to_i` with a refinement. The override is active only in the lexical scope where `using ZenToI::Refine` appears, and returns an Integer like the built-in `to_i` method.
57
55
 
58
56
  ```ruby
59
57
  require "zen_to_i/refine"
@@ -61,30 +59,29 @@ require "zen_to_i/refine"
61
59
  using ZenToI::Refine
62
60
 
63
61
  "一二三".zen_to_i
64
- #=> "103"
62
+ #=> "123"
65
63
 
66
64
  "一二三".to_i
67
- #=> 103
65
+ #=> 123
68
66
  ```
69
67
 
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.
68
+ You can also replace `String#to_i` globally by requiring `zen_to_i/string_ext`. This affects all strings in the process; the original `to_i` implementation remains available as `String#_to_i`. Use this only when a global override is intended.
72
69
 
73
70
  ```ruby
74
71
  require "zen_to_i/string_ext"
75
72
 
76
73
  "一二三".zen_to_i
77
- #=> "103"
74
+ #=> "123"
78
75
 
79
76
  "一二三".to_i
80
- #=> 103
77
+ #=> 123
81
78
  ```
82
79
 
83
80
 
84
81
  ## Contributing
85
82
 
86
- 1. Fork it
87
- 2. Create your feature branch (`git checkout -b my-new-feature`)
88
- 3. Commit your changes (`git commit -am 'Add some feature'`)
89
- 4. Push to the branch (`git push origin my-new-feature`)
90
- 5. Create new Pull Request
83
+ 1. Fork the repository.
84
+ 2. Create a feature branch (`git checkout -b my-new-feature`).
85
+ 3. Commit your changes (`git commit -am 'Add some feature'`).
86
+ 4. Push the branch (`git push origin my-new-feature`).
87
+ 5. Create a pull request.
data/bin/zen_to_i CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  Signal.trap("INT") { abort }
4
5
 
@@ -17,7 +18,7 @@ begin
17
18
  puts l.zen_to_i
18
19
  end
19
20
  end
20
- rescue => e
21
+ rescue StandardError => e
21
22
  warn e.inspect
22
23
  e.backtrace.each do |t|
23
24
  warn " #{t}"
@@ -2,17 +2,23 @@
2
2
 
3
3
  module ZenToI
4
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
13
- ALL_KANSUUJI = KANNUM.keys + KANORDER.keys + KANORDER_F.keys
14
- MAX_LOOP = 100
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
5
+ unless const_defined?(:KANNUM, false)
6
+ KANNUM = { "〇" => 0, "" => 1, "一" => 1, "二" => 2, "三" => 3, "四" => 4,
7
+ "五" => 5, "六" => 6, "七" => 7, "八" => 8, "九" => 9,
8
+ "零" => 0, "壱" => 1, "弐" => 2, "参" => 3, "肆" => 4,
9
+ "伍" => 5, "陸" => 6, "漆" => 7, "捌" => 8, "玖" => 9 }.freeze
10
+ KANORDER = { "十" => 10, "百" => 100, "千" => 1000, "" => 1, "拾" => 10,
11
+ "陌" => 100, "佰" => 100, "阡" => 1000, "仟" => 1000 }.freeze
12
+ KANORDER_F = { "万" => 10**4, "億" => 10**8, "兆" => 10**12,
13
+ "" => 1, "萬" => 10**4 }.freeze
14
+ ALL_KANSUUJI = KANNUM.keys + KANORDER.keys + KANORDER_F.keys
15
+ MAX_LOOP = 100
16
+ KANORDER_F_KEYS_REGEX = /([^#{KANORDER_F.keys.join("")}]*)([#{KANORDER_F.keys.join("")}]?)/
17
+ KANORDER_KEYS_REGEX = /([^#{KANORDER.keys.join("")}]*)([#{KANORDER.keys.join("")}]?)/
18
+ ALL_KANSUUJI_REGEX = /([#{ALL_KANSUUJI.join("")}]+)/
19
+ KANNUM_PAIR_REGEX = /([#{KANNUM.keys.join("")}])([#{KANNUM.keys.join("")}])/
20
+ end
21
+ end
22
+
23
+ Constant.freeze
18
24
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "./constant"
3
+ require_relative "constant"
4
4
 
5
5
  module ZenToI
6
6
  module Mixin
@@ -26,7 +26,7 @@ module ZenToI
26
26
 
27
27
  # 漢数字のところだけ切り出す
28
28
  def split_kansuuji(string)
29
- string.split(/([#{ALL_KANSUUJI.join('')}]+)/)
29
+ string.split(ALL_KANSUUJI_REGEX)
30
30
  end
31
31
 
32
32
  # 位を表す数ではない普通の漢数字が続いていたらわける
@@ -44,9 +44,8 @@ module ZenToI
44
44
 
45
45
  def split_kansuuji_detail_inner(array)
46
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(",")
47
+ if ALL_KANSUUJI_REGEX.match?(a)
48
+ a.gsub(KANNUM_PAIR_REGEX, '\1,\2').split(",")
50
49
  else
51
50
  a
52
51
  end
@@ -58,24 +57,27 @@ module ZenToI
58
57
  # それぞれに対して漢数字→数字を実行している。
59
58
  def convert_kansuuji(array)
60
59
  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
60
+ if ALL_KANSUUJI_REGEX.match?(a)
61
+ sum_kansuuji(a)
68
62
  else
69
63
  a
70
64
  end
71
65
  end
72
66
  end
73
67
 
74
- def format_location(string)
75
- location_map.each do |key, value|
76
- string.gsub!(/#{key}/, value)
68
+ def sum_kansuuji(str)
69
+ str.scan(KANORDER_F_KEYS_REGEX).inject(0) do |ret, (unit, order_f)|
70
+ ret + (unit_to_i(unit, order_f) * KANORDER_F[order_f].to_i)
71
+ end
72
+ end
73
+
74
+ # 大字だけの表記は 1 個分として数え、scan の末尾の空一致は桁を持たないので 0 とする。
75
+ def unit_to_i(unit, order_f)
76
+ return order_f.empty? ? 0 : 1 if unit.empty?
77
+
78
+ unit.scan(KANORDER_KEYS_REGEX).inject(-1) do |tmp, (kanji, order)|
79
+ tmp + (KANNUM[kanji].to_i * KANORDER[order].to_i)
77
80
  end
78
- string
79
81
  end
80
82
  end
81
83
  end
@@ -1,13 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../zen_to_i"
4
+ require_relative "to_i"
4
5
 
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
6
+ # 読み込んでも String#to_i は変わらない。`using ZenToI::Refine` した範囲だけで差し替えが有効になる。
7
+ module ZenToI
8
+ unless const_defined?(:Refine, false)
9
+ module Refine
10
+ refine String do
11
+ define_method(:_to_i, ZenToI::ToI.instance_method(:_to_i))
12
+ define_method(:to_i, ZenToI::ToI.instance_method(:to_i))
13
+ end
11
14
  end
12
15
  end
13
16
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../zen_to_i"
4
+ require_relative "to_i"
4
5
 
6
+ # 読み込むと String#to_i が漢数字変換に差し替わる。元の実装は String#_to_i に残る。
5
7
  class String
6
- alias_method :_to_i, :to_i
8
+ alias _to_i to_i unless String.method_defined?(:_to_i, false)
7
9
 
8
- def to_i
9
- self.zen_to_i._to_i
10
- end
10
+ define_method(:to_i, ZenToI::ToI.instance_method(:to_i))
11
11
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../zen_to_i"
4
+
5
+ module ZenToI
6
+ # string_ext.rb(グローバルに適用)と refine.rb(refinement 経由)で共有する。
7
+ module ToI
8
+ # 差し替え前の String#to_i を保持する。読み込み時点で String 自身が持つ
9
+ # ネイティブ実装を捕捉し、どのロード順でも素の to_i を参照できるようにする。
10
+ ORIGINAL_TO_I = String.instance_method(:to_i) unless const_defined?(:ORIGINAL_TO_I, false)
11
+
12
+ def to_i
13
+ ORIGINAL_TO_I.bind(zen_to_i).call
14
+ end
15
+
16
+ def _to_i(*)
17
+ ORIGINAL_TO_I.bind(self).call(*)
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ZenToI
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,85 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zen_to_i
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshitsugu
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2019-04-21 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
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
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
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'
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
83
12
  description: 全角文字に含まれる数字を半角の数値に変換。兆まで対応
84
13
  email:
85
14
  - zeroinon1206bass@gmail.com
@@ -88,29 +17,21 @@ executables:
88
17
  extensions: []
89
18
  extra_rdoc_files: []
90
19
  files:
91
- - ".gitignore"
92
- - ".rubocop.yml"
93
- - ".travis.yml"
94
- - Gemfile
95
20
  - LICENSE.txt
96
21
  - README.md
97
- - Rakefile
98
22
  - bin/zen_to_i
99
23
  - lib/zen_to_i.rb
100
24
  - lib/zen_to_i/constant.rb
101
25
  - lib/zen_to_i/mixin.rb
102
26
  - lib/zen_to_i/refine.rb
103
27
  - lib/zen_to_i/string_ext.rb
28
+ - lib/zen_to_i/to_i.rb
104
29
  - lib/zen_to_i/version.rb
105
- - spec/refine_spec.rb
106
- - spec/string_ext_spec.rb
107
- - spec/zen_to_i_spec.rb
108
- - zen_to_i.gemspec
109
- homepage: ''
30
+ homepage: https://github.com/yoshitsugu/zen_to_i
110
31
  licenses:
111
32
  - MIT
112
- metadata: {}
113
- post_install_message:
33
+ metadata:
34
+ rubygems_mfa_required: 'true'
114
35
  rdoc_options: []
115
36
  require_paths:
116
37
  - lib
@@ -118,18 +39,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
39
  requirements:
119
40
  - - ">="
120
41
  - !ruby/object:Gem::Version
121
- version: 2.4.6
42
+ version: 3.4.0
122
43
  required_rubygems_version: !ruby/object:Gem::Requirement
123
44
  requirements:
124
45
  - - ">="
125
46
  - !ruby/object:Gem::Version
126
47
  version: '0'
127
48
  requirements: []
128
- rubygems_version: 3.0.3
129
- signing_key:
49
+ rubygems_version: 4.0.20
130
50
  specification_version: 4
131
51
  summary: Japanese zenkaku to number
132
- test_files:
133
- - spec/refine_spec.rb
134
- - spec/string_ext_spec.rb
135
- - spec/zen_to_i_spec.rb
52
+ test_files: []
data/.gitignore DELETED
@@ -1,17 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
data/.rubocop.yml DELETED
@@ -1,6 +0,0 @@
1
- inherit_gem:
2
- onkcop:
3
- - "config/rubocop.yml"
4
-
5
- AllCops:
6
- TargetRubyVersion: 2.4
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.6.3
4
- - 2.5.5
5
- - 2.4.6
6
- script: bundle exec rspec
data/Gemfile DELETED
@@ -1,3 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "bundler/gem_tasks"
data/spec/refine_spec.rb DELETED
@@ -1,13 +0,0 @@
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
@@ -1,11 +0,0 @@
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,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "zen_to_i"
4
-
5
- describe ZenToI do
6
- describe "String#zen_to_i" do
7
- it "数字以外の文字の場合はそのまま返す" do
8
- expect("hoge".zen_to_i).to eq "hoge"
9
- end
10
-
11
- it "漢数字の場合は半角数字に変換する" do
12
- expect("一二三".zen_to_i).to eq "123"
13
- end
14
-
15
- it "位をあらわす漢数字を含む場合も半角数字に変換する" do
16
- expect("百三".zen_to_i).to eq "103"
17
- end
18
-
19
- it "兆の位まで半角数字に変換する" do
20
- expect("三兆五十二万四十八".zen_to_i).to eq "3000000520048"
21
- end
22
-
23
- it "大字でも変換可能" do
24
- expect("肆佰参拾捌".zen_to_i).to eq "438"
25
- end
26
- end
27
- end
data/zen_to_i.gemspec DELETED
@@ -1,26 +0,0 @@
1
- lib = File.expand_path("lib", __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "zen_to_i/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "zen_to_i"
7
- spec.version = ZenToI::VERSION
8
- spec.authors = ["yoshitsugu"]
9
- spec.email = ["zeroinon1206bass@gmail.com"]
10
- spec.description = "全角文字に含まれる数字を半角の数値に変換。兆まで対応"
11
- spec.summary = "Japanese zenkaku to number"
12
- spec.homepage = ""
13
- spec.license = "MIT"
14
- spec.required_ruby_version = ">= 2.4.6"
15
-
16
- spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
- spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_development_dependency "bundler"
22
- spec.add_development_dependency "onkcop"
23
- spec.add_development_dependency "pry"
24
- spec.add_development_dependency "rake"
25
- spec.add_development_dependency "rspec"
26
- end