HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Converting the integers to their equivalent string representations

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
theequivalentrepresentationsconvertingintegersstringtheir

Problem

I have the following function which converts an integer (such as 103) to its string representation ("one hundred three"):

NumberToString = (function ()
    local floor, abs, num, tens, bases = math.floor, math.abs, {
        [0] = '',
        'one',
        'two',
        'three',
        'four',
        'five',
        'six',
        'seven',
        'eight',
        'nine',
        'ten',
        'eleven',
        'twelve',
        'thirteen',
        'fourteen',
        'fifteen',
        'sixteen',
        'seventeen',
        'eighteen',
        'nineteen',
        'twenty'
    }, {
        [0] = 'and',
        [3] = 'thirty',
        [4] = 'forty',
        [5] = 'fifty',
        [6] = 'sixty',
        [7] = 'seventy',
        [8] = 'eighty',
        [9] = 'ninety',
    }, {

        [10^2] = ' hundred',
        [10^3] = ' thousand',
        [10^6] = ' million'
    }
    return function(n)
        local n = floor( abs(n) )
        local str = {}
        if n > 10^6 then
            table.insert( str, NumberToString(n / 10^6)..bases[10^6] )
            n = n % 10^6
        end
        if n > 10^3 then
            table.insert( str, NumberToString(n / 10^3)..bases[10^3] )
            n = n % 10^3
        end
        if n > 10^2 then
            table.insert( str, NumberToString(n / 10^2)..bases[10^2] )
            n = n % 10^2
        end
        if num[n] then
            table.insert( str, num[n] )
        else
            table.insert( str, tens[floor(n/10)]..' '..(n % 10 > 0 and num[n % 10] or '') )
        end
        return table.concat(str, ' ')
    end
end)()


Can I improve the performance somehow? Or does some other (and better method) exist for the desired results?

I think that the segment between line #43 to #53 is quite redundant and can be modified?

Solution

After a bit of dabbling with the script, I've updated the line #42 to #53 with a table iterator:

for _, ext in ipairs(bases) do
    if n > ext[1] then
        table.insert( str, NumberToString(n / ext[1])..ext[2] )
        n = n % ext[1]
    end
end


where, bases has been redefined as:

{
    { 10^12, ' trillion' },
    { 10^9, ' billion' },
    { 10^6, ' million' },
    { 10^3, ' thousand' },
    { 10^2, ' hundred' },
}


that is, in descending orders of powers of 10.

I'd welcome other suggestions as well.

Code Snippets

for _, ext in ipairs(bases) do
    if n > ext[1] then
        table.insert( str, NumberToString(n / ext[1])..ext[2] )
        n = n % ext[1]
    end
end
{
    { 10^12, ' trillion' },
    { 10^9, ' billion' },
    { 10^6, ' million' },
    { 10^3, ' thousand' },
    { 10^2, ' hundred' },
}

Context

StackExchange Code Review Q#54572, answer score: 4

Revisions (0)

No revisions yet.