StringToNumber

Gem Version CI License: MIT

Convert French written numbers into their numeric equivalents in Ruby.

goscribe demo

Quick Start

gem 'string_to_number'  # Add to your Gemfile, then: bundle install
require 'string_to_number'

StringToNumber.in_numbers('vingt et un')              #=> 21
StringToNumber.in_numbers('mille deux cent trente-quatre')  #=> 1234
StringToNumber.in_numbers('trois milliards')           #=> 3_000_000_000

Features

  • Fast — 14-460x faster than naive recursive parsing, via pre-compiled patterns and LRU caching
  • Complete — handles all standard French number words from zéro to billions, including compound forms (quatre-vingt-quatorze, soixante-dix)
  • Thread-safe — concurrent access with mutex-protected caches; >2M conversions/sec under contention
  • Zero dependencies — pure Ruby, no external gems required

Install

Prerequisites: Ruby 2.7+

gem install string_to_number

Or in your Gemfile:

gem 'string_to_number'

Usage

require 'string_to_number'

# Simple numbers
StringToNumber.in_numbers('zéro')          #=> 0
StringToNumber.in_numbers('quinze')        #=> 15
StringToNumber.in_numbers('cent')          #=> 100

# Compound numbers
StringToNumber.in_numbers('vingt et un')                     #=> 21
StringToNumber.in_numbers('quatre-vingt-quatorze')           #=> 94
StringToNumber.in_numbers('neuf mille neuf cent quatre-vingt-dix-neuf')  #=> 9999

# Large numbers
StringToNumber.in_numbers('un million')          #=> 1_000_000
StringToNumber.in_numbers('deux millions trois cent mille')  #=> 2_300_000

Validation and cache management

StringToNumber.valid_french_number?('vingt et un')  #=> true
StringToNumber.valid_french_number?('hello world')  #=> false

StringToNumber.cache_stats    # inspect cache hit ratios
StringToNumber.clear_caches!  # free cached data

For the full API, see the source documentation.

Known Issues

  • Input must be French number words only — mixed text (e.g. "il y a vingt personnes") is not supported
  • Regional Belgian/Swiss variants (septante, nonante) are recognized, but coverage may be incomplete

Contributing

Bug reports and pull requests are welcome on GitHub.

Acknowledgments

Created by Fabien Piette. Thanks to all contributors.

Buy Me A Coffee

License

MIT