Module: JapaneseAddressParser::JapaneseNumeral

Defined in:
lib/japanese_address_parser/japanese_numeral.rb,
sig/japanese_numeral.rbs

Overview

漢数字 ⇔ 数値の相互変換。kanji2number / number2kanji / find_kanji_numbers を公開する。

Constant Summary collapse

JAPANESE_NUMERICS =

値は実際には Integer だが、kan2n が未知文字を JS の undefined→NaN として 扱う(JAPANESE_NUMERICS[char] || Float::NAN)ため、ここでは untyped にする。

Returns:

  • (Hash[String, untyped])
{
  '' => 0,
  '' => 1,
  '' => 2,
  '' => 3,
  '' => 4,
  '' => 5,
  '' => 6,
  '' => 7,
  '' => 8,
  '' => 9,
  '' => 0,
  '' => 1,
  '' => 2,
  '' => 3,
  '' => 4,
  '' => 5,
  '' => 6,
  '' => 7,
  '' => 8,
  '' => 9
}.freeze
OLD_JAPANESE_NUMERICS =

src/oldJapaneseNumerics.ts。旧字体・異体字を新字体へ正規化する対応表。

Returns:

  • (Hash[String, String])
{
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '廿' => '二十',
  '' => '',
  '' => '',
  '' => '',
  '' => '',
  '' => ''
}.freeze
LARGE_NUMBERS =

src/utils.ts。挿入順を保持する(変換は大きい単位から順に処理する)。

Returns:

  • (Hash[String, Integer])
{ '' => 1_000_000_000_000, '' => 100_000_000, '' => 10_000 }.freeze
SMALL_NUMBERS =

Returns:

  • (Hash[String, Integer])
{ '' => 1000, '' => 100, '' => 10 }.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.find_kanji_numbers(text) ⇒ Object

JS: findKanjiNumbers(text) — src/index.ts



129
130
131
132
133
134
135
136
137
138
139
# File 'lib/japanese_address_parser/japanese_numeral.rb', line 129

def find_kanji_numbers(text)
  num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐弍貳貮参參肆伍陸漆捌玖]*)'
  base_pattern = "((#{num})(千|阡|仟))?((#{num})(百|陌|佰))?((#{num})(十|拾))?(#{num})?"
  pattern = "((#{base_pattern}兆)?(#{base_pattern}億)?(#{base_pattern}(万|萬))?#{base_pattern})"

  matches = ecmascript_global_match(text, pattern)

  matches.select do |item|
    !item.match?(/^[0-90-9]+$/) && !item.empty? && item != '' && item != '' && item != '' && item != ''
  end
end

.kanji2number(japanese) ⇒ Object

JS: kanji2number(japanese) — src/index.ts



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/japanese_address_parser/japanese_numeral.rb', line 77

def kanji2number(japanese)
  japanese = normalize(japanese)

  if japanese.match?(//) || japanese.match?(/^[〇一二三四五六七八九]+$/)
    JAPANESE_NUMERICS.each do |key, value|
      reg = ::Regexp.new(key)
      japanese = japanese.gsub(reg, value.to_s)
    end

    js_number(japanese)
  else
    # numbers の値は NaN になりうる(untyped)ので number も untyped で受ける。
    # @type var number: untyped
    number = 0
    numbers = split_large_number(japanese)

    # 万以上の数字を数値に変換
    LARGE_NUMBERS.each do |key, value|
      next unless js_truthy?(numbers[key])

      number += value * numbers[key]
    end

    raise(::TypeError, 'The attribute of kanji2number() must be a Japanese numeral as integer.') unless number.is_a?(::Integer) && numbers[''].is_a?(::Integer)

    # 千以下の数字を足す
    number + numbers['']
  end
end

.number2kanji(num) ⇒ Object

JS: number2kanji(num) — src/index.ts

Raises:

  • (::TypeError)


108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/japanese_address_parser/japanese_numeral.rb', line 108

def number2kanji(num)
  raise(::TypeError, 'The attribute of number2kanji() must be integer.') unless num.to_s.match?(/^[0-9]+$/)

  number = num
  kanji = ''

  # 万以上の数字を漢字に変換
  LARGE_NUMBERS.each do |key, value|
    n = number / value # JS: Math.floor(number / value)
    if js_truthy?(n)
      number -= n * value
      kanji = "#{kanji}#{n2kan(n)}#{key}"
    end
  end

  kanji = "#{kanji}#{n2kan(number)}" if js_truthy?(number)

  kanji.empty? ? '' : kanji # JS: kanji || '〇'
end

Instance Method Details

#self?.ecmascript_global_matchArray[String]

Parameters:

  • text (String)
  • pattern (String)

Returns:

  • (Array[String])


17
# File 'sig/japanese_numeral.rbs', line 17

def self?.ecmascript_global_match: (String text, String pattern) -> Array[String]

#self?.find_kanji_numbersArray[String]

Parameters:

  • text (String)

Returns:

  • (Array[String])


15
# File 'sig/japanese_numeral.rbs', line 15

def self?.find_kanji_numbers: (String text) -> Array[String]

#self?.js_numberObject

Parameters:

  • str (String)

Returns:

  • (Object)


23
# File 'sig/japanese_numeral.rbs', line 23

def self?.js_number: (String str) -> untyped

#self?.js_truthy?Boolean

Parameters:

  • value (Object)

Returns:

  • (Boolean)


24
# File 'sig/japanese_numeral.rbs', line 24

def self?.js_truthy?: (untyped value) -> bool

#self?.kan2nObject

Parameters:

  • japanese (String)

Returns:

  • (Object)


20
# File 'sig/japanese_numeral.rbs', line 20

def self?.kan2n: (String japanese) -> untyped

#self?.kanji2numberInteger

Parameters:

  • japanese (String)

Returns:

  • (Integer)


13
# File 'sig/japanese_numeral.rbs', line 13

def self?.kanji2number: (String japanese) -> Integer

#self?.n2kanString

Parameters:

  • num (Integer)

Returns:

  • (String)


21
# File 'sig/japanese_numeral.rbs', line 21

def self?.n2kan: (Integer num) -> String

#self?.normalizeString

Parameters:

  • japanese (String)

Returns:

  • (String)


18
# File 'sig/japanese_numeral.rbs', line 18

def self?.normalize: (String japanese) -> String

#self?.number2kanjiString

Parameters:

  • num (Object)

Returns:

  • (String)


14
# File 'sig/japanese_numeral.rbs', line 14

def self?.number2kanji: (untyped num) -> String

#self?.split_large_numberHash[String, untyped]

Parameters:

  • japanese (String)

Returns:

  • (Hash[String, untyped])


19
# File 'sig/japanese_numeral.rbs', line 19

def self?.split_large_number: (String japanese) -> Hash[String, untyped]

#self?.zen2hanString

Parameters:

  • str (String)

Returns:

  • (String)


22
# File 'sig/japanese_numeral.rbs', line 22

def self?.zen2han: (String str) -> String