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 digitsCountry/region where used
European digitsEurope, the Americas, and many other countries/regions
Arabic-Indic digitsArabic countries/regions (although many use European digits)
Other national digits: Indic digits, Thai digits, and the likeVarious 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.

Note   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.

FlagsDigits usedUsed in
ETO_NUMERICSLATINEuropean digitsExtTextOut
ETO_NUMERICSLOCALDigits appropriate to the localeExtTextOut
GCP_NUMERICSLATINEuropean digitsGetCharacterPlacement
GCP_NUMERICSLOCALDigits appropriate to the localeGetCharacterPlacement
GCPCLASS_LOCALNUMBERDigits appropriate to the localeGCP_RESULTS


Related topics

About National Language Support