ya_kansuji 0.2.0 → 1.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
2
  SHA256:
3
- metadata.gz: 9b533562701ef0ed367dc665df6190ad55d8e967b6301b2edd915c594eb96337
4
- data.tar.gz: 81f83784f8e57fc41efff6a9c1f757aad7e3d9c3dcb9b406296f771de09b214b
3
+ metadata.gz: 3ae15d72bf1414795e2fc0b0c8b31b292dde3fec64183ad0c8407b561a27dcc0
4
+ data.tar.gz: b5a101d4e735075625e4190be2bd6e4a57d2ce419a80312ce256a427fe17dd55
5
5
  SHA512:
6
- metadata.gz: dc82119a8fb4b6d60513e12816c08f1e7d61e53678bef560036d6084f13a1e72ac3c4b19277b94dc4eab8e286f2d7dddd9c8b728c51dcca4b3ac437e356ec486
7
- data.tar.gz: 9600d3bc5233393c6ce2c1fdae3cddc119e1f38c12bd6643da8ce8dffb151791d9edb7d4edaff66c6d42c103d2e59dcdc57eabf786556f977fdfdc876753afcb
6
+ metadata.gz: bc79795e352c88129045537e093d76fb59169f2424faa0416a2cf9d829e8a6763ba0fa2a06e1e31e8c1032ed04c0fdb96e54e5677216ca355955f622f67e1c76
7
+ data.tar.gz: 4fd9683d6c48f51ba18bee9e47fa8e393f150a4f0471ddd0c98e5886dda6a52a99a39d34c9e8383b0e7285465d11fd7f51fc3b7f65b1da3507fcfa7e525c51c3
data/ChangeLog CHANGED
@@ -1,3 +1,16 @@
1
+ 2026-07-13 Tatsuki Sugiura <sugi@nemui.org>
2
+
3
+ * Version: 1.1.0
4
+ * Support leading "マイナス" for negative numbers on parsing
5
+ * Fix regexp construction bug for single-character units
6
+ * CI maintenance (update ruby versions, tolerate Coveralls failure)
7
+
8
+ 2025-03-09 Tatsuki Sugiura <sug@nemui.org>
9
+
10
+ * Version: 1.0.0
11
+ * Minor changes to cleanup build with ruby 3.x
12
+ * Strip whitespace on parsing.
13
+
1
14
  2019-04-21 Tatsuki Sugiura <sugi@nemui.org>
2
15
 
3
16
  * Version: 0.2.0
data/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # YaKansuji - もう一つの (やりすぎ) ruby 漢数字ライブラリ
2
2
 
3
3
  [<img src="https://badge.fury.io/rb/ya_kansuji.svg" alt="Gem Version" />](https://badge.fury.io/rb/ya_kansuji)
4
- [<img src="https://travis-ci.org/sugi/ya_kansuji.svg?branch=master" alt="Build Status" />](https://travis-ci.org/sugi/ya_kansuji)
5
- [<img src="https://coveralls.io/repos/sugi/ya_kansuji/badge.svg?branch=master&service=github" alt="Coverage Status" />](https://coveralls.io/github/sugi/ya_kansuji?branch=master)
4
+ [<img src="https://github.com/sugi/ya_kansuji/actions/workflows/ruby.yml/badge.svg" alt="Build Status" />](https://github.com/sugi/ya_kansuji/actions/workflows/ruby.yml)
5
+ [<img src="https://coveralls.io/repos/github/sugi/ya_kansuji/badge.svg?branch=master" alt="Coverage Status" />](https://coveralls.io/github/sugi/ya_kansuji?branch=master)
6
6
  [![Maintainability](https://api.codeclimate.com/v1/badges/007f79c6f7f6e82daa20/maintainability)](https://codeclimate.com/github/sugi/ya_kansuji/maintainability)
7
+ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/048e7a2f52cb48908c4deba7ce696f08)](https://app.codacy.com/gh/sugi/ya_kansuji/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
7
8
 
8
9
  Yet another (ultimate) Japanese Kansuji library for ruby.
9
10
 
@@ -20,6 +21,7 @@ YaKansuji は ruby 用の日本語の漢数字ライブラリです。 和暦ラ
20
21
  * 位取り (2億0010万 / 千〇〇二)
21
22
  * 大字 (千皕卅肆)
22
23
  * カンマ表現 (12,345 / 5億3,456万 / 二万、五十)
24
+ * 負数 (マイナス五十)
23
25
  * 数値から漢数字, 漢字混じり数値文字列フォーマット
24
26
  * 複数のビルトインフォーマッタ
25
27
  * フォーマッタプラグイン機構
@@ -45,6 +47,7 @@ gem 'ya_kansuji'
45
47
 
46
48
  ```ruby
47
49
  YaKansuji.to_i("一〇二四") # => 1024
50
+ YaKansuji.to_i("マイナス一〇二四") # => -1024
48
51
  ```
49
52
 
50
53
  ### フォーマット (数値 → 漢数字)
@@ -53,6 +56,7 @@ YaKansuji.to_i("一〇二四") # => 1024
53
56
 
54
57
  ```ruby
55
58
  YaKansuji.to_kan(12345) # => 一万二千三百四十五
59
+ YaKansuji.to_kan(-12345) # => マイナス一万二千三百四十五
56
60
  ```
57
61
 
58
62
  このさい、2つめの引数にシンボルを渡すことにより、フォーマッタを切り替えることができます。
@@ -77,6 +81,7 @@ YaKansuji.to_kan(12340005, :judic_h) # => "1234万0005"
77
81
 
78
82
  `YaKansuji#register_formatter` を使うと独自のフォーマッタを登録できます。
79
83
  `#call` を持つ任意のオブジェクトもしくはブロックを渡します。第1引数に数字、第2引数にオプションが渡ります。
84
+ 負数を渡した場合も、フォーマッタには絶対値 (非負整数) が渡され、符号 (「マイナス」) は `to_kan` 側で前置されます。
80
85
 
81
86
  ```ruby
82
87
  YaKansuji.register_formatter :hoge, -> (num, opts = {}) {
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ya_kansuji'
4
+
5
+ # Core extension by kansuji
6
+ class Integer
7
+ def to_kan
8
+ YaKansuji.to_kan self
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ya_kansuji'
4
+
5
+ # Core extension by kansuji
6
+ class String
7
+ alias _to_i_ya_kansuji_orig to_i unless defined?(_to_i_ya_kansuji_orig)
8
+
9
+ def to_i(base = nil)
10
+ if base.nil? || base == :kan
11
+ YaKansuji.to_i self
12
+ else
13
+ _to_i_ya_kansuji_orig(base)
14
+ end
15
+ end
16
+ end
@@ -1,23 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ya_kansuji'
4
-
5
- # Core extension by kansuji
6
- class String
7
- alias _to_i_ya_kansuji_orig to_i unless defined?(_to_i_ya_kansuji_orig)
8
-
9
- def to_i(base = nil)
10
- if base.nil? || base == :kan
11
- YaKansuji.to_i self
12
- else
13
- _to_i_ya_kansuji_orig(base)
14
- end
15
- end
16
- end
17
-
18
- # Core extension by kansuji
19
- class Integer
20
- def to_kan
21
- YaKansuji.to_kan self
22
- end
23
- end
3
+ require 'ya_kansuji/core_ext/string'
4
+ require 'ya_kansuji/core_ext/integer'
@@ -2,15 +2,15 @@
2
2
 
3
3
  require 'ya_kansuji'
4
4
 
5
- # String and Integer refinements with YaKansuji
6
5
  module YaKansuji
6
+ # String and Integer refinements with YaKansuji
7
7
  module CoreRefine
8
8
  refine String do
9
9
  def to_i(base = nil)
10
10
  if base.nil? || base == :kan || base == :kansuji
11
11
  YaKansuji.to_i self
12
12
  else
13
- super base
13
+ super
14
14
  end
15
15
  end
16
16
  end
@@ -1,6 +1,6 @@
1
- # Simple kansuji formatter
2
1
  module YaKansuji
3
2
  module Formatter
3
+ # Formatter for Japan government-style kansuji
4
4
  module Gov
5
5
  module_function
6
6
 
@@ -9,14 +9,14 @@ module YaKansuji
9
9
 
10
10
  parts = []
11
11
  (UNIT_EXP4.reverse + ['']).each_with_index do |unit4, ridx4|
12
- i4 = (num / 10_000**(UNIT_EXP4.size - ridx4)).to_i % 10_000
12
+ i4 = (num / (10_000**(UNIT_EXP4.size - ridx4))).to_i % 10_000
13
13
  next if i4.zero?
14
14
 
15
15
  if i4 == 1
16
16
  parts << "1#{unit4}"
17
17
  next
18
18
  end
19
- parts << i4.to_s + unit4
19
+ parts << (i4.to_s + unit4)
20
20
  end
21
21
  parts.join(', ')
22
22
  end
@@ -1,6 +1,7 @@
1
1
  # Simple kansuji formatter
2
2
  module YaKansuji
3
3
  module Formatter
4
+ # Formatter for Jpanese judicial style kansuji (arabic numerals version)
4
5
  module JudicH
5
6
  module_function
6
7
 
@@ -10,13 +11,13 @@ module YaKansuji
10
11
  ret = ''
11
12
  head = true
12
13
  (UNIT_EXP4.reverse + ['']).each_with_index do |unit4, ridx4|
13
- i4 = (num / 10_000**(UNIT_EXP4.size - ridx4)).to_i % 10_000
14
+ i4 = (num / (10_000**(UNIT_EXP4.size - ridx4))).to_i % 10_000
14
15
  next if i4.zero?
15
16
 
16
17
  if head
17
- ret << i4.to_s + unit4
18
+ ret << (i4.to_s + unit4)
18
19
  else
19
- ret << ('%04d' % i4) + unit4
20
+ ret << (('%04d' % i4) + unit4)
20
21
  end
21
22
  head = false
22
23
  end
@@ -1,6 +1,7 @@
1
1
  # Simple kansuji formatter
2
2
  module YaKansuji
3
3
  module Formatter
4
+ # Formatter for Jpanese judicial style kansuji (kanji numerals version)
4
5
  module JudicV
5
6
  module_function
6
7
 
@@ -10,13 +11,13 @@ module YaKansuji
10
11
  ret = ''
11
12
  head = true
12
13
  (UNIT_EXP4.reverse + ['']).each_with_index do |unit4, ridx4|
13
- i4 = (num / 10_000**(UNIT_EXP4.size - ridx4)).to_i % 10_000
14
+ i4 = (num / (10_000**(UNIT_EXP4.size - ridx4))).to_i % 10_000
14
15
  next if i4.zero?
15
16
 
16
17
  if head
17
- ret << i4.to_s + unit4
18
+ ret << (i4.to_s + unit4)
18
19
  else
19
- ret << ('%04d' % i4) + unit4
20
+ ret << (('%04d' % i4) + unit4)
20
21
  end
21
22
  head = false
22
23
  end
@@ -1,6 +1,7 @@
1
1
  # Simple kansuji formatter
2
2
  module YaKansuji
3
3
  module Formatter
4
+ # Formatter for Jpanese lawyer style kansuji
4
5
  module Lawyer
5
6
  module_function
6
7
 
@@ -9,7 +10,7 @@ module YaKansuji
9
10
 
10
11
  ret = ''
11
12
  (UNIT_EXP4.reverse + ['']).each_with_index do |unit4, ridx4|
12
- i4 = (num / 10_000**(UNIT_EXP4.size - ridx4)).to_i % 10_000
13
+ i4 = (num / (10_000**(UNIT_EXP4.size - ridx4))).to_i % 10_000
13
14
  next if i4.zero?
14
15
 
15
16
  if i4 == 1
@@ -17,7 +18,7 @@ module YaKansuji
17
18
  next
18
19
  end
19
20
 
20
- ret << (i4 >= 1000 ? "#{i4.to_s[0]},#{i4.to_s[1..-1]}" : i4.to_s) + unit4
21
+ ret << ((i4 >= 1000 ? "#{i4.to_s[0]},#{i4.to_s[1..-1]}" : i4.to_s) + unit4)
21
22
  end
22
23
  ret
23
24
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Simple kansuji formatter
4
3
  module YaKansuji
5
4
  module Formatter
5
+ # Simple kansuji formatter
6
6
  module Simple
7
7
  module_function
8
8
 
@@ -11,7 +11,7 @@ module YaKansuji
11
11
 
12
12
  ret = ''
13
13
  (UNIT_EXP4.reverse + ['']).each_with_index do |unit4, ridx4|
14
- i4 = (num / 10_000**(UNIT_EXP4.size - ridx4)).to_i % 10_000
14
+ i4 = (num / (10_000**(UNIT_EXP4.size - ridx4))).to_i % 10_000
15
15
  next if i4.zero?
16
16
 
17
17
  if i4 == 1
@@ -19,7 +19,7 @@ module YaKansuji
19
19
  next
20
20
  end
21
21
  (UNIT_EXP3.reverse + ['']).each_with_index do |unit3, ridx3|
22
- i3 = (i4 / 10**(UNIT_EXP3.size - ridx3)).to_i % 10
22
+ i3 = (i4 / (10**(UNIT_EXP3.size - ridx3))).to_i % 10
23
23
  next if i3.zero?
24
24
 
25
25
  if i3 == 1 && unit3 != ''
@@ -1,3 +1,3 @@
1
1
  module YaKansuji
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
data/lib/ya_kansuji.rb CHANGED
@@ -7,24 +7,26 @@ require 'ya_kansuji/core_refine'
7
7
  module YaKansuji
8
8
  UNIT_EXP3 = %w(十 百 千).freeze
9
9
  UNIT_EXP4 = %w(万 億 兆 京 垓 𥝱 穣 溝 澗 正 載 極 恒河沙 阿僧祇 那由他 不可思議 無量大数).freeze
10
- NUM_ALT_CHARS = '〇一二三四五六七八九0123456789零壱壹弌弐貳貮参參弎肆伍陸漆質柒捌玖拾什陌佰阡仟萬秭'.freeze
11
- NUM_NORMALIZED_CHARS = '01234567890123456789011122233345677789十十百百千千万𥝱'.freeze
10
+ NUM_ALT_CHARS = '〇一二三四五六七八九0123456789零壱壹弌弐貳貮参參弎肆伍陸漆質柒捌玖拾什陌佰阡仟萬秭'
11
+ NUM_NORMALIZED_CHARS = '01234567890123456789011122233345677789十十百百千千万𥝱'
12
+ # rubocop:disable Lint/DuplicateRegexpCharacterClassElement
12
13
  REGEXP_PART = %r{
13
14
  [
14
15
  #{(NUM_ALT_CHARS + NUM_NORMALIZED_CHARS).chars.uniq.join}
15
- #{(UNIT_EXP3 + UNIT_EXP4).find_all { |u| u.length == 1 }}
16
+ #{(UNIT_EXP3 + UNIT_EXP4).find_all { |u| u.length == 1 }.join}
16
17
  卄廿卅丗卌皕
17
18
  ] |
18
19
  #{UNIT_EXP4.find_all { |u| u.length > 1 }.join('|')}
19
20
  }x.freeze
20
- REGEXP = /(?:#{REGEXP_PART})+/.freeze
21
+ # rubocop:enable Lint/DuplicateRegexpCharacterClassElement
22
+ REGEXP = /(?:マイナス)?(?:#{REGEXP_PART})+/.freeze
21
23
  @@formatters = {}
22
24
 
23
25
  module_function
24
26
 
25
27
  def to_i(str)
26
28
  str = str.to_s.tr(NUM_ALT_CHARS, NUM_NORMALIZED_CHARS)
27
- str.gsub!(/[,,、:space:]/, '')
29
+ str.gsub!(/[,,、[:space:]]/, '')
28
30
  matched = REGEXP.match(str) or return 0
29
31
  ret3 = 0
30
32
  ret4 = 0
@@ -63,11 +65,11 @@ module YaKansuji
63
65
  curnum = nil
64
66
  end
65
67
  ret3 = 1 if ret3.zero?
66
- ret4 += ret3 * 10**((UNIT_EXP4.index(c) + 1) * 4)
68
+ ret4 += ret3 * (10**((UNIT_EXP4.index(c) + 1) * 4))
67
69
  ret3 = 0
68
70
  when *UNIT_EXP3
69
71
  curnum ||= 1
70
- ret3 += curnum * 10**(UNIT_EXP3.index(c) + 1)
72
+ ret3 += curnum * (10**(UNIT_EXP3.index(c) + 1))
71
73
  curnum = nil
72
74
  end
73
75
  end
@@ -75,7 +77,8 @@ module YaKansuji
75
77
  ret3 += curnum
76
78
  curnum = nil
77
79
  end
78
- ret4 + ret3
80
+ ret = ret4 + ret3
81
+ matched[0].start_with?('マイナス') ? -ret : ret
79
82
  end
80
83
 
81
84
  def register_formatter(sym, proc = nil, &block)
@@ -98,6 +101,8 @@ module YaKansuji
98
101
 
99
102
  def to_kan(num, formatter = :simple, options = {})
100
103
  num.respond_to?(:_to_i_ya_kansuji_orig) ? num = num._to_i_ya_kansuji_orig : num = num.to_i
104
+ return "マイナス#{to_kan(-num, formatter, options)}" if num.negative?
105
+
101
106
  if formatter.respond_to? :call
102
107
  formatter.call num, options
103
108
  elsif @@formatters[formatter]
metadata CHANGED
@@ -1,57 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ya_kansuji
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuki Sugiura
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  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: '1.9'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '1.9'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '10.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '3.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '3.0'
11
+ date: 2026-07-13 00:00:00.000000000 Z
12
+ dependencies: []
55
13
  description: |
56
14
  Pure ruby library of Japanese kansuji.
57
15
  Bi-directional convert support between number and kanji string.
@@ -66,6 +24,8 @@ files:
66
24
  - README.md
67
25
  - lib/ya_kansuji.rb
68
26
  - lib/ya_kansuji/core_ext.rb
27
+ - lib/ya_kansuji/core_ext/integer.rb
28
+ - lib/ya_kansuji/core_ext/string.rb
69
29
  - lib/ya_kansuji/core_refine.rb
70
30
  - lib/ya_kansuji/formatter/gov.rb
71
31
  - lib/ya_kansuji/formatter/judic_h.rb
@@ -76,8 +36,9 @@ files:
76
36
  homepage: https://github.com/sugi/ya_kansuji
77
37
  licenses:
78
38
  - MIT
79
- metadata: {}
80
- post_install_message:
39
+ metadata:
40
+ rubygems_mfa_required: 'true'
41
+ post_install_message:
81
42
  rdoc_options: []
82
43
  require_paths:
83
44
  - lib
@@ -92,9 +53,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
53
  - !ruby/object:Gem::Version
93
54
  version: '0'
94
55
  requirements: []
95
- rubyforge_project:
96
- rubygems_version: 2.7.6.2
97
- signing_key:
56
+ rubygems_version: 3.1.6
57
+ signing_key:
98
58
  specification_version: 4
99
59
  summary: Japanese kansuji library for ruby
100
60
  test_files: []