numerosaletras

Number to words in Word.

Word can do this without a macro, which Excel cannot. Here is the field, what it produces, and the three places it stops.

Plain words

{ =1234 \* CardText \* Lower }

one thousand two hundred thirty-four

Check shape

{ =1234.56 \* DollarText \* Lower }

one thousand two hundred thirty-four and 56/100

01 · what Word has

A field, not a function.

{ =1234 \* CardText } writes "one thousand two hundred thirty-four" into the document, with no code and nothing to install.

This is a real advantage Word has over Excel, which ships with nothing of the kind. A field is a small instruction embedded in the text; it calculates and displays a result, and it updates when you tell it to. The two switches that matter here are CardText, which gives plain words, and DollarText, which gives the check shape with the cents over one hundred.

There is one detail that stops most people before they start: the braces have to be inserted with Ctrl+F9. Typing { and } from the keyboard produces ordinary characters and the field never runs, which is why so many people conclude the feature does not exist.

02 · how to insert it

Four keystrokes.

01

Press Ctrl+F9

This inserts an empty pair of field braces. Typing { and } from the keyboard does not work — Word treats them as ordinary characters and the field never runs.

02

Type the field inside

For example =1234 \* CardText. The equals sign matters: it makes the field a calculation rather than a reference.

03

Press F9

This updates the field and shows the result. Alt+F9 toggles between the code and the result if you need to go back and edit it.

04

Check the number

Under a million you get words. Over it, an error — which is the limit worth knowing before you rely on the field for a contract.

03 · where it stops

Three limits, and one of them is close.

The field is genuinely useful and it is not a complete solution. These three are worth knowing before you rely on it in a document that matters.

01

It stops at 999,999.99

From one million up the field returns an error instead of words. That is the ceiling most people meet first, because an amount small enough to stay under it is usually small enough not to need writing out.

02

It has no negatives

The lowest value the field will convert is zero. A credit, an adjustment or anything expressed as a negative has to be handled another way.

03

Its capitalisation is limited

A second switch controls case — \* Upper, \* Lower, \* FirstCap, \* Caps — and none of them produces the Title Case a check line uses, where the word after a hyphen is also capitalised.

The first is the one that bites. A million is not a large amount in a contract, a property transaction or an invoice between companies, and the field does not degrade gracefully — it returns an error where the words should be, which is easy to miss in a long document that was updated after it was written.

04 · a note for translators

The field writes in Office's language.

Not the document's. The field takes its language from the Office installation, so a Spanish contract written on an English-language Word will get "one thousand two hundred" in the middle of it.

For an English document this is invisible, because the behaviour and the requirement happen to agree. It is worth knowing anyway: if you write in more than one language, the field is reliable in exactly one of them, and silently wrong in the others.

The Spanish and Portuguese pages on this site have to lead with that warning. This one does not, which is the clearest example of why these pages are written separately rather than translated.

05 · the macro

For everything past the ceiling.

The macro below has none of the three limits: it goes into the trillions, handles negatives, produces Title Case for a check line, and can add a currency word. Paste it into a module with Alt+F11, then select a number in the document and run SpellSelection.

Visual Basic for Applications — Word

' ============================================================
' NumberToWords — spell a number or an amount in English
' Generated by numerosaletras.org/en/number-to-words-word
'
' Paste into a module (Alt+F11 > Insert > Module). Word has no
' cells, so call it from a macro or replace a selection:
'   Selection.Text = NumberToWords(1234.56)
'
' Hyphenates twenty-one to ninety-nine, leaves out the "and"
' after the hundreds (American usage), and keeps the scale words
' singular.
' ============================================================
Option Explicit

Private Function Under20En(ByVal n As Long) As String
    Dim w As Variant
    w = Array("", "one", "two", "three", "four", "five", "six", "seven", _
              "eight", "nine", "ten", "eleven", "twelve", "thirteen", _
              "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
    Under20En = w(n)
End Function

Private Function Under100En(ByVal n As Long) As String
    Dim tens As Variant, t As Long, u As Long
    tens = Array("", "", "twenty", "thirty", "forty", "fifty", _
                 "sixty", "seventy", "eighty", "ninety")
    If n < 20 Then
        Under100En = Under20En(n)
        Exit Function
    End If
    t = n \ 10
    u = n Mod 10
    If u = 0 Then
        Under100En = tens(t)
    Else
        ' The hyphen is not decoration: twenty-one is one word.
        Under100En = tens(t) & "-" & Under20En(u)
    End If
End Function

Private Function Under1000En(ByVal n As Long) As String
    Dim h As Long, rest As Long, out As String
    h = n \ 100
    rest = n Mod 100
    If h > 0 Then out = Under20En(h) & " hundred"
    If rest > 0 Then
        If Len(out) > 0 Then out = out & " "
        out = out & Under100En(rest)
    End If
    Under1000En = out
End Function

Private Function DigitsEn(ByVal text As String) As String
    Dim i As Long, out As String, d As Long
    For i = 1 To Len(text)
        d = CLng(Mid(text, i, 1))
        If Len(out) > 0 Then out = out & " "
        If d = 0 Then
            out = out & "zero"
        Else
            out = out & Under20En(d)
        End If
    Next i
    DigitsEn = out
End Function

' Capitalises the first letter of every word, including after a hyphen,
' which is what a check line needs: "Twenty-Three", not "Twenty-three".
Private Function TitleCaseEn(ByVal text As String) As String
    Dim i As Long, ch As String, prev As String, out As String
    prev = " "
    For i = 1 To Len(text)
        ch = Mid(text, i, 1)
        If prev = " " Or prev = "-" Then
            out = out & UCase(ch)
        Else
            out = out & ch
        End If
        prev = ch
    Next i
    TitleCaseEn = out
End Function

Public Function NumberToWords(ByVal value As Variant) As String
    Dim wholeValue As Double, centsValue As Long, centsText As String
    Dim groups As Variant, i As Long, groupValue As Long
    Dim result As String, scales As Variant, rest As Double

    If Not IsNumeric(value) Then
        NumberToWords = "Not a number"
        Exit Function
    End If

    Dim negative As Boolean
    negative = (value < 0)
    value = Abs(value)

    wholeValue = Int(value)
    centsValue = CLng((value - wholeValue) * 100 + 0.5)
    If centsValue >= 100 Then centsValue = 99
    centsText = Format(centsValue, "00")

    scales = Array("", " thousand", " million", " billion", " trillion")

    If wholeValue = 0 Then
        result = "zero"
    Else
        rest = wholeValue
        Dim parts(0 To 4) As String
        i = 0
        Do While rest > 0 And i <= 4
            groupValue = CLng(rest - Int(rest / 1000) * 1000)
            If groupValue > 0 Then
                parts(i) = Under1000En(groupValue) & scales(i)
            End If
            rest = Int(rest / 1000)
            i = i + 1
        Loop
        For i = 4 To 0 Step -1
            If Len(parts(i)) > 0 Then
                If Len(result) > 0 Then result = result & " "
                result = result & parts(i)
            End If
        Next i
    End If



    If negative Then result = "negative " & result

    NumberToWords = TitleCaseEn(result)
    NumberToWords = NumberToWords & " and " & Format(centsValue, "00") & "/100"
End Function

' ------------------------------------------------------------
' Replaces the selected number with its words. Select a figure
' in the document and run this from the Macros dialog.
' ------------------------------------------------------------
Public Sub SpellSelection()
    Dim raw As String
    raw = Trim(Selection.Text)
    raw = Replace(raw, ",", "")
    If Not IsNumeric(raw) Then
        MsgBox "Select a number first."
        Exit Sub
    End If
    Selection.Text = NumberToWords(CDbl(raw))
End Sub

Copied

06 · questions

Frequently asked questions.

  1. Q01

    Can Word convert numbers to words without a macro?

    Yes. Word has a field switch for it — { =1234 \* CardText } produces "one thousand two hundred thirty-four" — and unlike Excel, this is genuinely built in. It has real limits, but for an English document under a million it works with no code at all.

  2. Q02

    What is the difference between CardText and DollarText?

    CardText writes the number as plain words. DollarText writes it in the check shape, with the cents as a fraction over one hundred: "one thousand two hundred thirty-four and 56/100". If you are filling in an amount line, DollarText is the one you want.

  3. Q03

    Why does my field show an error?

    Most likely the number is a million or more, which is where the field stops. It can also happen if the braces were typed by hand rather than inserted with Ctrl+F9, or if the equals sign is missing — without it the field is not a calculation and has nothing to convert.

  4. Q04

    Why does the field give me the words in English when my document is not?

    Because it writes in the language of the Office installation, not the language of the document. For an English document that is exactly what you want, and it is the reason this page is more useful than its Spanish equivalent — there, the same field returns English into a Spanish contract.

  5. Q05

    How do I capitalise the result?

    Add a second switch: \* Upper for capitals, \* FirstCap for a leading capital, \* Lower for lowercase. What none of them gives you is Title Case with the letter after a hyphen capitalised, which is what a check line wants — that needs the macro.

  6. Q06

    Does the field update automatically?

    No. Fields update on F9, when you print, or when the document is opened depending on your settings. If you change the number and the words stay the same, select the field and press F9. This catches people out on documents that are edited over time.

  7. Q07

    When should I use the macro instead?

    When the amount reaches a million, when it can be negative, when you need Title Case, or when you want a currency word in the output. The field covers the simple cases well and stops abruptly; the macro has none of those ceilings because it shares its algorithm with the converter on this site.

  8. Q08

    Can I use the same code in Excel?

    The body is the same — the macro on this page is the Excel one with a Word entry point added, since Word has no cells to reference. The Excel page has the sheet version plus a LAMBDA for anywhere macros are blocked.

Field first, macro when it stops.

Under a million, in an English document, with simple capitalisation, the built-in field is the right answer and takes four keystrokes. Past any of those, take the macro.