lib/german_numbers/parser/parser.rb in german_numbers-0.5 vs lib/german_numbers/parser/parser.rb in german_numbers-0.7
- old
+ new
@@ -6,11 +6,11 @@
end
class Parser
extend GermanNumbers::StateMachine
state_machine_for :order do
- state :initial, can_be_initial: true, final: false
+ state :initial, final: false
state :thousands
state :million_keyword, final: false
state :millionen_keyword, final: false
state :million, final: true
state :millions, final: true
@@ -19,21 +19,24 @@
state :billion, final: true
state :billions, final: true
transition from: :initial, to: %i[thousands million_keyword millionen_keyword
milliarde_keyword milliarden_keyword]
- transition from: :thousands, to: %i[million_keyword millionen_keyword milliarde_keyword milliarden_keyword]
+ transition from: :thousands, to: %i[million_keyword millionen_keyword milliarde_keyword
+ milliarden_keyword]
transition from: :million_keyword, to: :million
transition from: :millionen_keyword, to: :millions
transition from: :milliarde_keyword, to: :billion
transition from: :milliarden_keyword, to: :billions
transition from: :million, to: %i[milliarde_keyword milliarden_keyword]
transition from: :millions, to: %i[milliarde_keyword milliarden_keyword]
end
DIGITS = GermanNumbers::DIGITS.invert
+
ERRORS = ['ein', 'sech', 'sieb', nil, ''].freeze
+
KEYWORDS = {
'Million' => :million_keyword,
'Millionen' => :millionen_keyword,
'Milliarde' => :milliarde_keyword,
'Milliarden' => :milliarden_keyword
@@ -43,10 +46,11 @@
initialize_order(:initial)
end
def parse(string)
raise ParsingError if ERRORS.include?(string)
+
string.split(' ').reverse.inject(0, &method(:parse_part)).tap do
raise ParsingError unless final_order_state?
end
rescue ParsingError, StateMachine::StateError
raise ParsingError, "#{string} is not a valid German number"
@@ -74,18 +78,22 @@
self.order_state = :billion if order_state == :milliarde_keyword
self.order_state = :billions if order_state == :milliarden_keyword
if order_state == :million
raise ParsingError unless part == 'eine'
+
return sum + 1_000_000
end
if order_state == :billion
raise ParsingError unless part == 'eine'
+
return sum + 1_000_000_000
end
return sum + SmallNumberParser.new(2..999).parse(part) * 1_000_000 if order_state == :millions
return sum + SmallNumberParser.new(2..999).parse(part) * 1_000_000_000 if order_state == :billions
+
+ raise ParsingError
end
# rubocop:enable Metrics/AbcSize
# rubocop:enable Metrics/MethodLength
# rubocop:enable Metrics/CyclomaticComplexity
# rubocop:enable Metrics/PerceivedComplexity