Digit Shapes

Arabic and many other languages have classical shapes for numbers that are different from the conventional western digits most often used on computers. To avoid ambiguity in naming these shapes, this document uses the following names from the Unicode standard.

Unicode name of the digits Country/region where used
European digits Europe, the Americas, and many other countries/regions
Arabic-Indic digits Arabic countries/regions (although many use European digits)
Other national digits: Indic digits, Thai digits, and the like Various countries/regions


Unicode provides separate code points for each digit shape. Thus, to access special language digit shapes, your application can use the relevant Unicode character codes for the digits above, U+0030 through U+0039. These codes are always displayed with the appropriate shape, subject to font availability.

The Unicode character codes U+0030 through U+0039 nominally represent the European digits 0 through 9, but their digit shape can be altered. GDI and DirectWrite text APIs provide mechanisms for applications to control this behavior. (See, for instance, ScriptApplyDigitSubstitution or IDWriteTextAnalysisSink::SetNumberSubstitution.) The behavior in some shell controls and user interface frameworks may respond to user locale settings for digit substitution; the LOCALE_IDIGITSUBSTITUTION LCTYPE can be used to obtain default digit substitution settings for different locales or the current user's desktop settings for digit substitution.

Native Digits

Native digits are the digit shapes chosen by the user in the Number property sheet in the regional and language options portion of the Control Panel. To find the digit presentation preferred by the user, your application uses the GetLocaleInfo or GetLocaleInfoEx function with the LOCALE_SNATIVEDIGITS constant representing the locale information.


Typically, Unicode digit codes are generated in runtime operating system routines. Therefore, common runtime operating systems must be upgraded for the application to inspect LOCALE_SNATIVEDIGITS appropriately.


Digit Substitution

The application can use digit substitution to tell the operating system how to print digits U+0030 through U+0039. The LOCALE_IDIGITSUBSTITUTION constant controls this operation.

Digit Shaping for a Single Function

The ExtTextOut, GetCharacterPlacement, and GCP_RESULTS functions have flags that govern the substitution of Unicode codes U+0030 through U+0039 for the duration of the function call. These flags override regional settings in the Control Panel, but do not reset the settings. Also, they do not override the Unicode codes NADS and NODS. The following flags are available.

Flags Digits used Used in
ETO_NUMERICSLATIN European digits ExtTextOut
ETO_NUMERICSLOCAL Digits appropriate to the locale ExtTextOut
GCP_NUMERICSLATIN European digits GetCharacterPlacement
GCP_NUMERICSLOCAL Digits appropriate to the locale GetCharacterPlacement
GCPCLASS_LOCALNUMBER Digits appropriate to the locale GCP_RESULTS


About National Language Support