Units and symbols
Bitcoin, bits, sats. The format and presentation of bitcoin values are probably amongst the most challenging for application builders. While there are no official standards for how they should be used, a good way to achieve converging user experiences is to formalize what is widely used today.
Current adoption #
Bitcoin is most commonly expressed as BTC (bitcoin) or sat (satoshi), with 1 bitcoin being 100 million satoshi. The unicode symbol ₿, formalized in June 2017, is also used to represent BTC (bitcoin), but typeface support is still limited. While not as common, other denominations of BTC such as mBTC (millibitcoins), μBTC (bits), as well as msat (millisatoshi) in the Lightning network are sometimes used. The chart below illustrates how each unit relates to the bitcoin unit.
|bitcoin||BTC or ₿||1|
|satoshi||sat||0.000 000 01|
|millisatoshi||msat||0.000 000 000 01|
For more information, see the Bitcoin Wiki:
Recommended interaction #
When displaying bitcoin values, the default unit for on-chain wallets should be bitcoin with 8 decimal places, and satoshi for Lightning wallets. Due to the challenging nature of scanning amounts with more than 2 decimal places, the user should be given the option to choose their preferred format across the application (for example, in the application’s settings) as well as contextually, whenever the value is primarily displayed.
Product teams can choose an approach based on their audience and targeted use case. Lightning wallets for daily spending may be better served by defaulting to satoshi denomination due to the low amounts involved, while bitcoin can be used for savings-focused applications.
Setting the preferred unit #
Applications should try to establish smart defaults that work for most users while offering convenient ways to customize settings.
Changing the unit display contextually #
User should always be able to change unit contextually. Additionally, for the value to have meaning to most users today, the option to select the local currency should also be readily available.
Formatting units #
There are many different ways of formatting numbers and currency units across the world. Bitcoin applications should be sensitive to these standards by adapting the formatting to the user’s locale. A simple example are digit group and decimal separators.
Interactive formatter #
Try entering different amounts in the interactive formatter below (which uses your browsers built-in formatting library) to see various country-specific formats.
Formatting very small amounts #
Satoshi values can sometimes be less than the smallest fiat unit, making the display of the value difficult. For example,
€0.0000431 is rounded to
€0.00 by most formatting libraries (include the one referenced above). To avoid this problem, you may need to implement custom rounding and formattic logic, based on the exchange rate of the local currency of your application.
For round values, you can show additional digits after the separator:
$0.3 -> $0.30(at least 2 digits because cent are based on 100)
$0.03 -> $0.03
$0.003 -> $0.003(always show the digit if lower than 1/100)
$0.0003 -> $0.0003
For uneven values, you can round to two non-zero digits and add ~ to indicate rounding.
$0.38878830 -> ~$0.39
$0.038878830 -> ~$0.039
$0.0038878830 -> ~$0.0039
$0.00038878830 -> ~$0.00039
The “Satcomma standard” (well explained by Mark Nugent and ProgrammableTX) is a proposal that suggests adjustment of digit group separators for better readability of small bitcoin fractions, as follows:
0.000 250 00 bitcoin
0.00 025 000 bitcoin
Starting the grouping from the right side makes it easier to identify the Satoshi value, which is in this example 25 000. As there is no clear consensus around this proposal, it is up to designers to decide whether this is appropriate for their audience.
Further reading #
For more examples and information, see Wikipedia:
Visual styling #
Type choices, spacing, color, and other details also affect the ease at which users can understand written amounts. Below are some options to consider.
Digit groups #
Clearly separating digit groups with spacing and/or color can help more quickly understand how large or small a number is.
Monospace fonts #
Proportional fonts adjust the spacing of characters for legibility, which is ideal in most situations. Characters in monospace fonts are of equal width, establishing consistency across lines.
Trailing zeros #
Trailing zeros can help more easily compare amounts in right-aligned tables.
Slashed zeros #
Complex use cases often require users to interact with addresses, public keys, and other encrypted data, where it is important that each character is easily identifiable. Slashed zeros can help distinguish 0 (the number zero) and O (the uppercase letter “O”), which can look very similar in some typefaces.
Note that uppercase letter “O”, uppercase letter “I”, lowercase letter “l”, and the number “0” are not valid characters in addresses, in order to prevent mistakes. As users may not be aware of this, using slashed zeros may still be a helpful design choice.
On to interoperability which is essential for smooth interaction and migration between bitcoin products.