Task

Show how to spell out a number in English.

You can use a preexisting implementation or roll your own, but you should support inputs up to at least one million (or the maximum value of your language's default bounded integer type, if that's less).

Support for inputs other than positive integers (like zero, negative integers, and floating-point numbers) is optional.



Related task

   Spelling of ordinal numbers.


 
function Get-NumberName
{
  <#
    .SYNOPSIS
        Spells out a number in English.
    .DESCRIPTION
        Spells out a number in English in the range of 0 to 999,999,999.
    .NOTES
        The code for this function was copied (almost word for word) from the C#
        example on this page to show how similar Powershell is to C#.
    .PARAMETER Number
        One or more integers in the range of 0 to 999,999,999.
    .EXAMPLE
        Get-NumberName -Number 666
    .EXAMPLE
        Get-NumberName 1, 234, 31337, 987654321
    .EXAMPLE
        1, 234, 31337, 987654321 | Get-NumberName
  #>
    [CmdletBinding()]
    [OutputType([string])]
    Param
    (
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [ValidateRange(0,999999999)]
        [int[]]
        $Number
    )
 
    Begin
    {
        [string[]]$incrementsOfOne = "zero",    "one",     "two",       "three",    "four",
                                     "five",    "six",     "seven",     "eight",    "nine",
                                     "ten",     "eleven",  "twelve",    "thirteen", "fourteen",
                                     "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
 
        [string[]]$incrementsOfTen = "",      "",      "twenty",  "thirty", "fourty",
                                     "fifty", "sixty", "seventy", "eighty", "ninety"
 
        [string]$millionName  = "million"
        [string]$thousandName = "thousand"
        [string]$hundredName  = "hundred"
        [string]$andName      = "and"
 
        function GetName([int]$i)
        {
            [string]$output = ""
 
            if ($i -ge 1000000)
            {
                $remainder = $null
                $output += (ParseTriplet ([Math]::DivRem($i,1000000,[ref]$remainder))) + " " + $millionName
                $i = $remainder
 
                if ($i -eq 0) { return $output }
            }
 
            if ($i -ge 1000)
            {
                if ($output.Length -gt 0)
                {
                    $output += ", "
                }
 
                $remainder = $null
                $output += (ParseTriplet ([Math]::DivRem($i,1000,[ref]$remainder))) + " " + $thousandName
                $i = $remainder
 
                if ($i -eq 0) { return $output }
            }
 
            if ($output.Length -gt 0)
            {
                $output += ", "
            }
 
            $output += (ParseTriplet $i)
 
            return $output
        }
 
        function ParseTriplet([int]$i)
        {
            [string]$output = ""
 
            if ($i -ge 100)
            {
                $remainder = $null
                $output += $incrementsOfOne[([Math]::DivRem($i,100,[ref]$remainder))] + " " + $hundredName
                $i = $remainder
 
                if ($i -eq 0) { return $output }
            }
 
            if ($output.Length -gt 0)
            {
                $output += " " + $andName + " "
            }
 
            if ($i -ge 20)
            {
                $remainder = $null
                $output += $incrementsOfTen[([Math]::DivRem($i,10,[ref]$remainder))]
                $i = $remainder
 
                if ($i -eq 0) { return $output }
            }
 
            if ($output.Length -gt 0)
            {
                $output += " "
            }
 
            $output += $incrementsOfOne[$i]
 
            return $output
        }
    }
    Process
    {
        foreach ($n in $Number)
        {
            [PSCustomObject]@{
                Number = $n
                Name   = GetName $n
            }
        }
    }
}
 
1, 234, 31337, 987654321 | Get-NumberName
 