zen_to_i 0.0.2 → 0.1.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
- 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"