in reply to Seeking a module to convert numbers to words

Maybe: Number::Spell provides functionality for spelling out numbers. Currently only integers are supported.

Update: Avogadro's constant should be the party-opener...

Do you know that there are more than six vigintillion elementary entities per mol?

(in response to 921420 below) ... but then, I found that vigintillion is 1063, not 1023! The modules source also sais it's 1021*3. So maybe this one will work? Do you know that a vigintillion has the prime factorisation 263 x 563? Different bases but same exponents - incredible! (see: also)

  • Comment on Re: Seeking a module to convert numbers to words

Replies are listed 'Best First'.
Re^2: Seeking a module to convert numbers to words
by kcott (Archbishop) on Aug 20, 2011 at 15:49 UTC

    Thanks Perlbotics. This has less functionality than Lingua::EN::Numbers but handles larger numbers. Mind you, if I ever saw something like three vigintillion written down, I'd probably need to look it up. :-)

    So I did look it up: vigintillion = 1063

    Not too sure how to work that into casual conversation without getting my face slapped, though.

    Update: The only number I remember from when I studied molarity is twenty-two point four which is obviously substantially smaller then six vigintillion. :-)

    (I remember it from: 1 mole of a gas at stp has a volume of 22.4l)

    Update 2: s{1023}{1063} - curious typo as my source had the correct value.

    -- Ken

      ... or alternatively filter all numbers first in your document, add some if and else rules here and there and create a %hash with this, it depends on what do you need exactly and could be more eficient if you only need to store what you have

        Update: My apologies pvaldes. This was not poorly received! I believe I have confused reception to a different post of yours. Probably need new glasses or something. Again, sorry. My original response follows:

        pvaldes, thanks for taking the time to reply. As I'm sure you're aware by now, your response has not been well received. Let's see if we can garner something positive from the exercise.

        In my original prototype code, I had something which is perhaps on par with what you're suggesting. Rather than digging out old versions, this gives an idea of what it may have looked like:

        # TODO - prototype code only! my @num2word = qw{zero one two ... twenty}; ... say q{I have }, $num2word[$apple_count], q{ apples.};

        Moving out of the prototype phase, this code obviously needed to be more robust. I searched around for an existing module without success and, having decided this would be an interesting exercise, came up with the following proof-of-concept:

        After ironing out bugs (mostly to do with output format), I put the non-test parts of this code into a module: Util::Number. Having added to @fixed_test_data as I tested, I have values for regression testing (which is still to do as well as POD).

        I was surprised that I hadn't been able to find any code like this. I decided to ask here and, if no one had any better ideas, look at putting this functionality on CPAN. You know the rest from this thread.

        Here's a quick comparison of the modules mentioned:

        $ perl -Mstrict -wE 'use Number::Spell; say spell_number(100010001001) +' one hundred billion ten million one thousand one $ perl -Mstrict -wE 'use Lingua::EN::Numbers qw{num2en}; say num2en(10 +0010001001)' one hundred billion, ten million, one thousand and, one $ perl -Mstrict -wE 'use Util::Number; say conv_num_to_text(1000100010 +01)' one hundred billion, ten million, one thousand and one

        In closing, providing something substantial will generally be well received whereas "... add some if and else rules here and there ..." will not. As you can see, while I have thrown a few ifs and elses around, there was nothing in your post that suggested how I should do this.

        I recommend you take a look at To Answer, Or Not To Answer.....

        P.S. I haven't downvoted your node: I reckon you've got enough bad press already. :-)

        -- Ken