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 にする。 { '〇' => 0, '一' => 1, '二' => 2, '三' => 3, '四' => 4, '五' => 5, '六' => 6, '七' => 7, '八' => 8, '九' => 9, '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9 }.freeze
- OLD_JAPANESE_NUMERICS =
src/oldJapaneseNumerics.ts。旧字体・異体字を新字体へ正規化する対応表。
{ '零' => '〇', '壱' => '一', '壹' => '一', '弐' => '二', '弍' => '二', '貳' => '二', '貮' => '二', '参' => '三', '參' => '三', '肆' => '四', '伍' => '五', '陸' => '六', '漆' => '七', '捌' => '八', '玖' => '九', '拾' => '十', '廿' => '二十', '陌' => '百', '佰' => '百', '阡' => '千', '仟' => '千', '萬' => '万' }.freeze
- LARGE_NUMBERS =
src/utils.ts。挿入順を保持する(変換は大きい単位から順に処理する)。
{ '兆' => 1_000_000_000_000, '億' => 100_000_000, '万' => 10_000 }.freeze
- SMALL_NUMBERS =
{ '千' => 1000, '百' => 100, '十' => 10 }.freeze
Class Method Summary collapse
-
.find_kanji_numbers(text) ⇒ Object
JS: findKanjiNumbers(text) — src/index.ts.
-
.kanji2number(japanese) ⇒ Object
JS: kanji2number(japanese) — src/index.ts.
-
.number2kanji(num) ⇒ Object
JS: number2kanji(num) — src/index.ts.
Instance Method Summary collapse
- #self?.ecmascript_global_match ⇒ Array[String]
- #self?.find_kanji_numbers ⇒ Array[String]
- #self?.js_number ⇒ Object
- #self?.js_truthy? ⇒ Boolean
- #self?.kan2n ⇒ Object
- #self?.kanji2number ⇒ Integer
- #self?.n2kan ⇒ String
- #self?.normalize ⇒ String
- #self?.number2kanji ⇒ String
- #self?.split_large_number ⇒ Hash[String, untyped]
- #self?.zen2han ⇒ String
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
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_match ⇒ Array[String]
17 |
# File 'sig/japanese_numeral.rbs', line 17
def self?.ecmascript_global_match: (String text, String pattern) -> Array[String]
|
#self?.find_kanji_numbers ⇒ Array[String]
15 |
# File 'sig/japanese_numeral.rbs', line 15
def self?.find_kanji_numbers: (String text) -> Array[String]
|
#self?.js_number ⇒ Object
23 |
# File 'sig/japanese_numeral.rbs', line 23
def self?.js_number: (String str) -> untyped
|
#self?.js_truthy? ⇒ Boolean
24 |
# File 'sig/japanese_numeral.rbs', line 24
def self?.js_truthy?: (untyped value) -> bool
|
#self?.kan2n ⇒ Object
20 |
# File 'sig/japanese_numeral.rbs', line 20
def self?.kan2n: (String japanese) -> untyped
|
#self?.kanji2number ⇒ Integer
13 |
# File 'sig/japanese_numeral.rbs', line 13
def self?.kanji2number: (String japanese) -> Integer
|
#self?.n2kan ⇒ String
21 |
# File 'sig/japanese_numeral.rbs', line 21
def self?.n2kan: (Integer num) -> String
|
#self?.normalize ⇒ String
18 |
# File 'sig/japanese_numeral.rbs', line 18
def self?.normalize: (String japanese) -> String
|
#self?.number2kanji ⇒ String
14 |
# File 'sig/japanese_numeral.rbs', line 14
def self?.number2kanji: (untyped num) -> String
|
#self?.split_large_number ⇒ Hash[String, untyped]
19 |
# File 'sig/japanese_numeral.rbs', line 19
def self?.split_large_number: (String japanese) -> Hash[String, untyped]
|
#self?.zen2han ⇒ String
22 |
# File 'sig/japanese_numeral.rbs', line 22
def self?.zen2han: (String str) -> String
|