Money Talks! Formatting Currency in Web Content

I was recently asked to comment on the Australian Government Style Manual’s advice on using currency symbols.

Non-Australian currency symbols may be inaccessible to people who access content using screen readers. Screen readers may be unable to interpret and describe the symbols. Avoid the use of non-Australian currency symbols where possible.

The Manual goes on to suggest options for referencing non-Australian currencies.

Use the 3-letter International Bank Account Number (IBAN) currency codes – for example, THB, USD, VND. This is the preferred method because it doesn’t use symbols and makes content more accessible.

When referencing ‘dollar’ currencies, use a country prefix followed by the ‘$’ symbol – for example, A$, C$, NZ$, US$. If there is any chance of confusion, use the 3-letter IBAN codes.

Use the currency symbol only, for example ‘£’ for the British pound, if you have evidence that it is the best way to meet a user need.

Back in July 2023, I wrote a blog post for TPGI called Making Numbers in Web Content Accessible, which included the following comment.

Also note that most screen readers will announce most currency symbols, “dollar” for “$”, “pound” for “£”, and so on. However (and you can guess what I’m going to say here), the best advice is to test with user agents. When you’re dealing with money, you want to be sure.

Note that this blog post was drawn from information in our KnowledgeBase, which our accessibility engineers and our clients use as guidelines for making web content accessible.

I was aware that money in web content is a bit unusual, in that money amounts are not typically spoken in the same sequence they are written, i.e., we write “$58.96” but say “fifty-eight dollars and ninety-six cents”. 

I figured the best thing to do is to follow my own “best advice” and conduct some testing. In particular, I wanted to test how various screen readers announce different variations in how currency is formatted.

The results were surprising, to say the least.

I tested with the following screen readers.

  • JAWS v 2024.2310.70, with Chrome on Windows 11
  • NVDA v 2023.3 (2023.3.0.29780), with Chrome on Windows 11
  • Narrator latest version, with Chrome on Windows 11
  • TalkBack latest version, with Chrome on Android 10
  • VoiceOver latest version, with Safari on iOS 15.8

All screen readers were at default settings.

The language of the web page I tested was set to “en-US”. Changing the language code to “en-AU” or any other language code made no difference to any screen reader.

Some screen readers, like JAWS, can be installed to use a language other than English. I have some anecdotal evidence that this affects how currencies are announced, but I was not able to test this.

I tested 10 currency formats:

  • $58.96
  • US$58.96
  • A$58.96
  • AU$58.96
  • AUD59.96
  • ¥58.96
  • £58.96
  • €58.96
  • THB58.96
  • VND58.96

Test results

$58.96

  • JAWS: dollar fifty-eight point nine six
  • NVDA: fifty-eight dollars and ninety-six cents
  • Narrator: fifty-eight dollars and ninety-six cents
  • TalkBack: fifty-eight dollars ninety-six cents
  • VoiceOver: fifty-eight dollars and ninety-six cents

US$58.96

  • JAWS: u s dollar fifty-eight point nine six
  • NVDA: fifty-eight u s dollars and ninety-six cents
  • Narrator: fifty-eight u s dollars and ninety-six cents
  • TalkBack: u s dollar fifty-eight point nine six
  • VoiceOver: u s u s

A$58.96

  • JAWS: a dollar fifty-eight point nine six
  • NVDA: a dollar fifty-eight dot ninety-six
  • Narrator: a dollar fifty-eight dot ninety-six
  • TalkBack: a dollar fifty-eight point nine six
  • VoiceOver: fifty-eight Australian dollars and ninety-six cents

AU$58.96

  • JAWS: a u dollar fifty-eight point nine six
  • NVDA: fifty-eight Australian dollars and ninety-six cents
  • Narrator: fifty-eight Australian dollars and ninety-six cents
  • TalkBack: au (or) dollar fifty-eight point nine six
  • VoiceOver: au (oh) dollars nine fifty-eight point nine six

AUD58.96

  • JAWS: aud (ord) fifty-eight point nine six
  • NVDA: fifty-eight Australian dollars and ninety-six cents
  • Narrator: fifty-eight Australian dollars and ninety-six cents
  • TalkBack: aud (ord) fifty-eight point nine six
  • VoiceOver: fifty-eight Australian dollars and ninety-six cents

¥58.96

  • JAWS: yen fifty-eight point nine six
  • NVDA: fifty-eight point ninety-six yen
  • Narrator: fifty-eight point ninety-six yen
  • TalkBack: yen fifty-eight point nine six
  • VoiceOver: fifty-eight point ninety-six yen

£58.96

  • JAWS: fifty-eight pounds and ninety-six pence
  • NVDA: fifty-eight pounds and ninety-six pence
  • Narrator: fifty-eight pounds and ninety-six pence
  • TalkBack: fifty-eight pounds point nine six
  • VoiceOver: fifty-eight British pounds and ninety-six pence

€58.96

  • JAWS: euro fifty-eight point nine six
  • NVDA: fifty-eight euros and ninety-six cents
  • Narrator: fifty-eight euros and ninety-six cents
  • TalkBack: fifty-eight point nine six
  • VoiceOver: fifty-eight euros dot ninety-six

THB58.96

  • JAWS: t h b fifty-eight point nine six
  • NVDA: t h b fifty-eight point nine six
  • Narrator: t h b fifty-eight dot nine six
  • TalkBack: t h b fifty-eight point nine six
  • VoiceOver: t h b fifty-eight dot ninety-six

VND58.96

  • JAWS: v n d fifty-eight point nine six
  • NVDA: v n d fifty-eight point nine six
  • Narrator: v n d fifty-eight dot nine six
  • TalkBack: v n d fifty-eight point nine six
  • VoiceOver: v n d fifty-eight dot ninety-six

Observations

There is no single optimal way to format currency so that it is announced by all five screen readers tested as an amount of money in the way a person would in conversation. 

While JAWS recognizes and announces the dollar symbol, it does not recognize the numerical amount as money. It therefore announces each symbol, letter or combination of letters, the numbers as just a part of a text string.

NVDA does recognize the numerical amount as money if it is preceded by the dollar symbol alone, by the dollar symbol plus a two-letter country code, or by a three-letter IBAN code. In those cases, it correctly announces the money amount as a human would. However, if the money amount is preceded by a single-letter country code, NVDA does not recognize it as money and just announces the text string.

Narrator behaves the same way as NVDA.

TalkBack recognizes and announces the numerical amount as money if it’s preceded only by the currency symbol alone, in which case it announces the amount as a human would. In the other four cases, Talkback just announces the text string.

VoiceOver recognizes and announces the numerical amount as money if it’s preceded by the currency symbol alone, by the currency symbol plus a one-letter country code (the only screen reader to do so), or by the three-letter IBAN code.

If the amount is preceded by the currency symbol plus the two-letter Australian country code, VoiceOver announces it as just a text string, and adds a “nine” in front of “fifty-eight”.

If the amount is preceded by the currency symbol plus the two-letter US country code, VoiceOver inexplicably just announces the two-letter country code – twice.

The Australian government advice, “When referencing ‘dollar’ currencies, use a country prefix followed by the ‘$’ symbol – for example, A$, C$, NZ$, US$” only works on VoiceOver.

Their advice to “Use the 3-letter International Bank Account Number (IBAN) currency codes” works for “AUD” on NVDA, Narrator and VoiceOver, but neither JAWS nor TalkBack recognize the IBAN code “AUD”, and attempt to pronounce it as a word, followed by the numerical string as text.

No screen reader recognized the IBAN code “THB” (for Thai Baht) or “VND” (for Vietnamese Dong).

Every screen reader recognized the symbol for Yen, and all but JAWS announced the money amount correctly.

Every screen reader recognized the symbol for Pound, and all announced the money amount correctly, with VoiceOver announcing it as “British pounds”.

All screen readers recognized the symbol for Euro. NVDA and Narrator announced the money amount correctly. VoiceOver announced the Euros part correctly but relegated the cents part to just “dot ninety-six”. TalkBack ignored the symbol complete and just announced the number string.

Conclusions

If the amount is in US dollars, do not use any prefixes. This produces the correct announcement in NVDA, Narrator, TalkBack and VoiceOver. While JAWS doesn’t announce the amount as money, it does read out the text string correctly. A fail-safe measure web authors could take would be to add a note to the web page to the effect of “all amounts are in US dollars”.

If the amount is in a non-US dollar currency, e.g., Australian, preceding the amount with the three-letter IBAN code produces the correct result in NVDA, TalkBack and VoiceOver, while the JAWS and TalkBack announcements are more or less understandable.

Only the most common non-dollar currency symbols are likely to be recognized and announced more or less correctly by most screen readers, including the Pound (£), the Yen (¥) and the Euro (€). While not included in this test, a quick check for the Thai Baht (฿) and the Vietnamese Dong (₫) found no support.

The same applies to the three-letter IBAN codes. While GBP, JPY, and EUR have some support, THB and VND have none. When referring to amounts in those currencies, it is best to write the currency names out in full, e.g., Thai Baht and Vietnamese Dong.

Over time, I expect increased and improved support for how screen readers announce currency symbols, country codes, IBAN codes and money amounts in general. It may also be possible to configure settings in some screen readers to improve how money amounts are announced.

It’s also important to note that regular screen reader users become used to their software’s quirks. An international money trader who uses JAWS may not have any trouble understanding exactly what “ord fifty-eight point nine six” means. It’s often better not to try to manipulate content to meet expectations that users don’t even have. Even so, a standardized way of making it clear that content refers to a money amount in a particular currency would be useful.

In the meantime, given the increasing importance of financial transactions conducted on the web, as acknowledged by WCAG Success Criterion 3.3.4 Error Prevention (Legal, Financial, Data) (Level AA), web authors should take particular care in how they present money and currency to avoid confusing or misleading screen reader users. 

Resources

 

Categories: Technical

About Ricky Onsman

Veteran Australian web designer, front end developer, writer and editor. As a writer and/or editor, I've worked with the likes of UX Australia, SitePoint, Web Directions and Smashing Magazine. As a freelance designer and front end dev, I focused on building accessible websites, then worked with a number of design, UX and accessibility-focused companies in Australia, North America and Europe before joining the Knowledge Center team at TPGi.

Comments

Ricky Onsman says:

FYI, my selections of screen reader / browser / OS combinations were based on popularity, as described in WebAIM’s most recent Screen Reader User Survey. There’s an argument to say I could have included NVDA / Firefox / Windows and VoiceOver / Safari / macOS as they have some popularity and may deliver significantly different results. Similarly, I could have extended the formats tested to HTML codes and HTML entity codes, as those options often come up in web pages that have been converted from word processing documents. Perhaps that’s all material for a follow-up post!

Curtis Wilcox says:

It might be helpful to also list the voice used in tests, they can make a difference in how these details are read. For example, on my Mac (14.3 with Safari 17.3), US$58.96 is read by Samantha (the default U.S. voice) as “fifty-eight u s dollars point ninety-six” but by Eloquence Eddy as “u s fifty-eight dollars point ninety-six.” I did not find any differences for any of the currencies between Samantha and Allison (Enhanced) or Karen, the English (Australia) voice listed.

This could also explain differences when JAWS is installed for different languages, the default voice is likely different.

On my iPhone (iOS 17.3 using Samantha), US$58.96 is read correctly, as “fifty-eight u s dollars and ninety-six cents” (which is not identical to Samantha on the Mac, which annoys me).

Yet another factor that *might* make a difference is the operating system’s Language & Region setting, they might read more variations of “local” currency in a more natural way.

In general, I think it’s best to also list browser version but for this test, which is only comparing text node output, not HTML semantics, it probably doesn’t matter. I also wouldn’t expect any difference using NVDA with Firefox vs. Chrome. My hunch is HTML codes or entity codes also wouldn’t matter, that they end up as the same code points in the text node.