<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>locale – POSIX cultural localization API — Python Module of the Week</title> <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '../', VERSION: '1.132', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> <link rel="author" title="About these documents" href="../about.html" /> <link rel="top" title="Python Module of the Week" href="../index.html" /> <link rel="up" title="Internationalization" href="../i18n.html" /> <link rel="next" title="Program Frameworks" href="../frameworks.html" /> <link rel="prev" title="gettext – Message Catalogs" href="../gettext/index.html" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="../frameworks.html" title="Program Frameworks" accesskey="N">next</a> |</li> <li class="right" > <a href="../gettext/index.html" title="gettext – Message Catalogs" accesskey="P">previous</a> |</li> <li><a href="../contents.html">PyMOTW</a> »</li> <li><a href="../i18n.html" accesskey="U">Internationalization</a> »</li> </ul> </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> <h3><a href="../contents.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">locale – POSIX cultural localization API</a><ul> <li><a class="reference internal" href="#probing-the-current-locale">Probing the Current Locale</a></li> <li><a class="reference internal" href="#currency">Currency</a></li> <li><a class="reference internal" href="#formatting-numbers">Formatting Numbers</a></li> <li><a class="reference internal" href="#parsing-numbers">Parsing Numbers</a></li> <li><a class="reference internal" href="#dates-and-times">Dates and Times</a></li> </ul> </li> </ul> <h4>Previous topic</h4> <p class="topless"><a href="../gettext/index.html" title="previous chapter">gettext – Message Catalogs</a></p> <h4>Next topic</h4> <p class="topless"><a href="../frameworks.html" title="next chapter">Program Frameworks</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="../_sources/locale/index.txt" rel="nofollow">Show Source</a></li> </ul> <div id="searchbox" style="display: none"> <h3>Quick search</h3> <form class="search" action="../search.html" method="get"> <input type="text" name="q" size="18" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="module-locale"> <span id="locale-posix-cultural-localization-api"></span><h1>locale – POSIX cultural localization API<a class="headerlink" href="#module-locale" title="Permalink to this headline">¶</a></h1> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> <tr class="field"><th class="field-name">Purpose:</th><td class="field-body">Format and parse values that depend on location or language.</td> </tr> <tr class="field"><th class="field-name">Python Version:</th><td class="field-body">1.5 and later</td> </tr> </tbody> </table> <p>The <a class="reference internal" href="#module-locale" title="locale: POSIX cultural localization API"><tt class="xref py py-mod docutils literal"><span class="pre">locale</span></tt></a> module is part of Python’s internationalization and localization support library. It provides a standard way to handle operations that may depend on the language or location of a user. For example, it handles formatting numbers as currency, comparing strings for sorting, and working with dates. It does not cover translation (see the <a class="reference internal" href="../gettext/index.html#module-gettext" title="gettext: Message Catalogs"><tt class="xref py py-mod docutils literal"><span class="pre">gettext</span></tt></a> module) or Unicode encoding.</p> <div class="admonition note"> <p class="first admonition-title">Note</p> <p class="last">Changing the locale can have application-wide ramifications, so the recommended practice is to avoid changing the value in a library and to let the application set it one time. In the examples below, the locale is changed several times within a short program to highlight the differences in the settings of various locales. It is far more likely that your application will set the locale once at startup and not change it.</p> </div> <div class="section" id="probing-the-current-locale"> <h2>Probing the Current Locale<a class="headerlink" href="#probing-the-current-locale" title="Permalink to this headline">¶</a></h2> <p>The most common way to let the user change the locale settings for an application is through an environment variable (<tt class="xref py py-data docutils literal"><span class="pre">LC_ALL</span></tt>, <tt class="xref py py-data docutils literal"><span class="pre">LC_CTYPE</span></tt>, <tt class="xref py py-data docutils literal"><span class="pre">LANG</span></tt>, or <tt class="xref py py-data docutils literal"><span class="pre">LANGUAGE</span></tt>, depending on the platform). The application then calls <tt class="xref py py-func docutils literal"><span class="pre">setlocale()</span></tt> without a hard-coded value, and the environment value is used.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">locale</span> <span class="kn">import</span> <span class="nn">os</span> <span class="kn">import</span> <span class="nn">pprint</span> <span class="kn">import</span> <span class="nn">codecs</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="o">=</span> <span class="n">codecs</span><span class="o">.</span><span class="n">getwriter</span><span class="p">(</span><span class="s">'UTF-8'</span><span class="p">)(</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span> <span class="c"># Default settings based on the user's environment.</span> <span class="n">locale</span><span class="o">.</span><span class="n">setlocale</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">LC_ALL</span><span class="p">,</span> <span class="s">''</span><span class="p">)</span> <span class="k">print</span> <span class="s">'Environment settings:'</span> <span class="k">for</span> <span class="n">env_name</span> <span class="ow">in</span> <span class="p">[</span> <span class="s">'LC_ALL'</span><span class="p">,</span> <span class="s">'LC_CTYPE'</span><span class="p">,</span> <span class="s">'LANG'</span><span class="p">,</span> <span class="s">'LANGUAGE'</span> <span class="p">]:</span> <span class="k">print</span> <span class="s">'</span><span class="se">\t</span><span class="si">%s</span><span class="s"> = </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">env_name</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">env_name</span><span class="p">,</span> <span class="s">''</span><span class="p">))</span> <span class="c"># What is the locale?</span> <span class="k">print</span> <span class="k">print</span> <span class="s">'Locale from environment:'</span><span class="p">,</span> <span class="n">locale</span><span class="o">.</span><span class="n">getlocale</span><span class="p">()</span> <span class="n">template</span> <span class="o">=</span> <span class="s">"""</span> <span class="s">Numeric formatting:</span> <span class="s"> Decimal point : "</span><span class="si">%(decimal_point)s</span><span class="s">"</span> <span class="s"> Grouping positions : </span><span class="si">%(grouping)s</span><span class="s"></span> <span class="s"> Thousands separator: "</span><span class="si">%(thousands_sep)s</span><span class="s">"</span> <span class="s">Monetary formatting:</span> <span class="s"> International currency symbol : "</span><span class="si">%(int_curr_symbol)r</span><span class="s">"</span> <span class="s"> Local currency symbol : </span><span class="si">%(currency_symbol)r</span><span class="s"> (</span><span class="si">%(currency_symbol_u)s</span><span class="s">)</span> <span class="s"> Symbol precedes positive value : </span><span class="si">%(p_cs_precedes)s</span><span class="s"></span> <span class="s"> Symbol precedes negative value : </span><span class="si">%(n_cs_precedes)s</span><span class="s"></span> <span class="s"> Decimal point : "</span><span class="si">%(mon_decimal_point)s</span><span class="s">"</span> <span class="s"> Digits in fractional values : </span><span class="si">%(frac_digits)s</span><span class="s"></span> <span class="s"> Digits in fractional values, international: </span><span class="si">%(int_frac_digits)s</span><span class="s"></span> <span class="s"> Grouping positions : </span><span class="si">%(mon_grouping)s</span><span class="s"></span> <span class="s"> Thousands separator : "</span><span class="si">%(mon_thousands_sep)s</span><span class="s">"</span> <span class="s"> Positive sign : "</span><span class="si">%(positive_sign)s</span><span class="s">"</span> <span class="s"> Positive sign position : </span><span class="si">%(p_sign_posn)s</span><span class="s"></span> <span class="s"> Negative sign : "</span><span class="si">%(negative_sign)s</span><span class="s">"</span> <span class="s"> Negative sign position : </span><span class="si">%(n_sign_posn)s</span><span class="s"></span> <span class="s">"""</span> <span class="n">sign_positions</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">:</span> <span class="s">'Surrounded by parentheses'</span><span class="p">,</span> <span class="mi">1</span> <span class="p">:</span> <span class="s">'Before value and symbol'</span><span class="p">,</span> <span class="mi">2</span> <span class="p">:</span> <span class="s">'After value and symbol'</span><span class="p">,</span> <span class="mi">3</span> <span class="p">:</span> <span class="s">'Before value'</span><span class="p">,</span> <span class="mi">4</span> <span class="p">:</span> <span class="s">'After value'</span><span class="p">,</span> <span class="n">locale</span><span class="o">.</span><span class="n">CHAR_MAX</span> <span class="p">:</span> <span class="s">'Unspecified'</span><span class="p">,</span> <span class="p">}</span> <span class="n">info</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">info</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">localeconv</span><span class="p">())</span> <span class="n">info</span><span class="p">[</span><span class="s">'p_sign_posn'</span><span class="p">]</span> <span class="o">=</span> <span class="n">sign_positions</span><span class="p">[</span><span class="n">info</span><span class="p">[</span><span class="s">'p_sign_posn'</span><span class="p">]]</span> <span class="n">info</span><span class="p">[</span><span class="s">'n_sign_posn'</span><span class="p">]</span> <span class="o">=</span> <span class="n">sign_positions</span><span class="p">[</span><span class="n">info</span><span class="p">[</span><span class="s">'n_sign_posn'</span><span class="p">]]</span> <span class="c"># convert the currency symbol to unicode</span> <span class="n">info</span><span class="p">[</span><span class="s">'currency_symbol_u'</span><span class="p">]</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s">'currency_symbol'</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">)</span> <span class="k">print</span> <span class="p">(</span><span class="n">template</span> <span class="o">%</span> <span class="n">info</span><span class="p">)</span> </pre></div> </div> <p>The <tt class="xref py py-func docutils literal"><span class="pre">localeconv()</span></tt> method returns a dictionary containing the locale’s conventions. The full list of value names and definitions is covered in the standard library documentation.</p> <p>A Mac running OS X 10.6 with all of the variables unset produces this output:</p> <div class="highlight-python"><pre>$ export LANG=; export LC_CTYPE=; python locale_env_example.py Environment settings: LC_ALL = LC_CTYPE = LANG = LANGUAGE = Locale from environment: (None, None) Numeric formatting: Decimal point : "." Grouping positions : [3, 3, 0] Thousands separator: "," Monetary formatting: International currency symbol : "'USD '" Local currency symbol : '$' ($) Symbol precedes positive value : 1 Symbol precedes negative value : 1 Decimal point : "." Digits in fractional values : 2 Digits in fractional values, international: 2 Grouping positions : [3, 3, 0] Thousands separator : "," Positive sign : "" Positive sign position : Before value and symbol Negative sign : "-" Negative sign position : Before value and symbol</pre> </div> <p>Running the same script with the <tt class="xref py py-data docutils literal"><span class="pre">LANG</span></tt> variable set shows how the locale and default encoding change:</p> <p>France (<tt class="docutils literal"><span class="pre">fr_FR</span></tt>):</p> <div class="highlight-python"><pre>$ LANG=fr_FR LC_CTYPE=fr_FR LC_ALL=fr_FR python locale_env_example.py Environment settings: LC_ALL = fr_FR LC_CTYPE = fr_FR LANG = fr_FR LANGUAGE = Locale from environment: ('fr_FR', 'ISO8859-1') Numeric formatting: Decimal point : "," Grouping positions : [127] Thousands separator: "" Monetary formatting: International currency symbol : "'EUR '" Local currency symbol : 'Eu' (Eu) Symbol precedes positive value : 0 Symbol precedes negative value : 0 Decimal point : "," Digits in fractional values : 2 Digits in fractional values, international: 2 Grouping positions : [3, 3, 0] Thousands separator : " " Positive sign : "" Positive sign position : Before value and symbol Negative sign : "-" Negative sign position : After value and symbol</pre> </div> <p>Spain (<tt class="docutils literal"><span class="pre">es_ES</span></tt>):</p> <div class="highlight-python"><pre>$ LANG=es_ES LC_CTYPE=es_ES LC_ALL=es_ES python locale_env_example.py Environment settings: LC_ALL = es_ES LC_CTYPE = es_ES LANG = es_ES LANGUAGE = Locale from environment: ('es_ES', 'ISO8859-1') Numeric formatting: Decimal point : "," Grouping positions : [127] Thousands separator: "" Monetary formatting: International currency symbol : "'EUR '" Local currency symbol : 'Eu' (Eu) Symbol precedes positive value : 1 Symbol precedes negative value : 1 Decimal point : "," Digits in fractional values : 2 Digits in fractional values, international: 2 Grouping positions : [3, 3, 0] Thousands separator : "." Positive sign : "" Positive sign position : Before value and symbol Negative sign : "-" Negative sign position : Before value and symbol</pre> </div> <p>Portgual (<tt class="docutils literal"><span class="pre">pt_PT</span></tt>):</p> <div class="highlight-python"><pre>$ LANG=pt_PT LC_CTYPE=pt_PT LC_ALL=pt_PT python locale_env_example.py Environment settings: LC_ALL = pt_PT LC_CTYPE = pt_PT LANG = pt_PT LANGUAGE = Locale from environment: ('pt_PT', 'ISO8859-1') Numeric formatting: Decimal point : "," Grouping positions : [] Thousands separator: " " Monetary formatting: International currency symbol : "'EUR '" Local currency symbol : 'Eu' (Eu) Symbol precedes positive value : 0 Symbol precedes negative value : 0 Decimal point : "." Digits in fractional values : 2 Digits in fractional values, international: 2 Grouping positions : [3, 3, 0] Thousands separator : "." Positive sign : "" Positive sign position : Before value and symbol Negative sign : "-" Negative sign position : Before value and symbol</pre> </div> <p>Poland (<tt class="docutils literal"><span class="pre">pl_PL</span></tt>):</p> <div class="highlight-python"><pre>$ LANG=pl_PL LC_CTYPE=pl_PL LC_ALL=pl_PL python locale_env_example.py Environment settings: LC_ALL = pl_PL LC_CTYPE = pl_PL LANG = pl_PL LANGUAGE = Locale from environment: ('pl_PL', 'ISO8859-2') Numeric formatting: Decimal point : "," Grouping positions : [3, 3, 0] Thousands separator: " " Monetary formatting: International currency symbol : "'PLN '" Local currency symbol : 'z\xc5\x82' (zł) Symbol precedes positive value : 1 Symbol precedes negative value : 1 Decimal point : "," Digits in fractional values : 2 Digits in fractional values, international: 2 Grouping positions : [3, 3, 0] Thousands separator : " " Positive sign : "" Positive sign position : After value Negative sign : "-" Negative sign position : After value</pre> </div> </div> <div class="section" id="currency"> <h2>Currency<a class="headerlink" href="#currency" title="Permalink to this headline">¶</a></h2> <p>The example output above shows that changing the locale updates the currency symbol setting and the character to separate whole numbers from decimal fractions. This example loops through several different locales to print a positive and negative currency value formatted for each locale:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">locale</span> <span class="n">sample_locales</span> <span class="o">=</span> <span class="p">[</span> <span class="p">(</span><span class="s">'USA'</span><span class="p">,</span> <span class="s">'en_US'</span><span class="p">),</span> <span class="p">(</span><span class="s">'France'</span><span class="p">,</span> <span class="s">'fr_FR'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Spain'</span><span class="p">,</span> <span class="s">'es_ES'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Portugal'</span><span class="p">,</span> <span class="s">'pt_PT'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Poland'</span><span class="p">,</span> <span class="s">'pl_PL'</span><span class="p">),</span> <span class="p">]</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">loc</span> <span class="ow">in</span> <span class="n">sample_locales</span><span class="p">:</span> <span class="n">locale</span><span class="o">.</span><span class="n">setlocale</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">LC_ALL</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="k">print</span> <span class="s">'</span><span class="si">%20s</span><span class="s">: </span><span class="si">%10s</span><span class="s"> </span><span class="si">%10s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">locale</span><span class="o">.</span><span class="n">currency</span><span class="p">(</span><span class="mf">1234.56</span><span class="p">),</span> <span class="n">locale</span><span class="o">.</span><span class="n">currency</span><span class="p">(</span><span class="o">-</span><span class="mf">1234.56</span><span class="p">))</span> </pre></div> </div> <p>The output is this small table:</p> <div class="highlight-python"><pre>$ python locale_currency_example.py USA: $1234.56 -$1234.56 France: 1234,56 Eu 1234,56 Eu- Spain: Eu 1234,56 -Eu 1234,56 Portugal: 1234.56 Eu -1234.56 Eu Poland: zł 1234,56 zł 1234,56-</pre> </div> </div> <div class="section" id="formatting-numbers"> <h2>Formatting Numbers<a class="headerlink" href="#formatting-numbers" title="Permalink to this headline">¶</a></h2> <p>Numbers not related to currency are also formatted differently depending on the locale. In particular, the <em>grouping</em> character used to separate large numbers into readable chunks is changed:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">locale</span> <span class="n">sample_locales</span> <span class="o">=</span> <span class="p">[</span> <span class="p">(</span><span class="s">'USA'</span><span class="p">,</span> <span class="s">'en_US'</span><span class="p">),</span> <span class="p">(</span><span class="s">'France'</span><span class="p">,</span> <span class="s">'fr_FR'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Spain'</span><span class="p">,</span> <span class="s">'es_ES'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Portugal'</span><span class="p">,</span> <span class="s">'pt_PT'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Poland'</span><span class="p">,</span> <span class="s">'pl_PL'</span><span class="p">),</span> <span class="p">]</span> <span class="k">print</span> <span class="s">'</span><span class="si">%20s</span><span class="s"> </span><span class="si">%15s</span><span class="s"> </span><span class="si">%20s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="s">'Locale'</span><span class="p">,</span> <span class="s">'Integer'</span><span class="p">,</span> <span class="s">'Float'</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">loc</span> <span class="ow">in</span> <span class="n">sample_locales</span><span class="p">:</span> <span class="n">locale</span><span class="o">.</span><span class="n">setlocale</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">LC_ALL</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="k">print</span> <span class="s">'</span><span class="si">%20s</span><span class="s">'</span> <span class="o">%</span> <span class="n">name</span><span class="p">,</span> <span class="k">print</span> <span class="n">locale</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">'</span><span class="si">%15d</span><span class="s">'</span><span class="p">,</span> <span class="mi">123456</span><span class="p">,</span> <span class="n">grouping</span><span class="o">=</span><span class="bp">True</span><span class="p">),</span> <span class="k">print</span> <span class="n">locale</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">'</span><span class="si">%20.2f</span><span class="s">'</span><span class="p">,</span> <span class="mf">123456.78</span><span class="p">,</span> <span class="n">grouping</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> </pre></div> </div> <p>To format numbers without the currency symbol, use <tt class="xref py py-func docutils literal"><span class="pre">format()</span></tt> instead of <tt class="xref py py-func docutils literal"><span class="pre">currency()</span></tt>.</p> <div class="highlight-python"><pre>$ python locale_grouping.py Locale Integer Float USA 123,456 123,456.78 France 123456 123456,78 Spain 123456 123456,78 Portugal 123456 123456,78 Poland 123 456 123 456,78</pre> </div> </div> <div class="section" id="parsing-numbers"> <h2>Parsing Numbers<a class="headerlink" href="#parsing-numbers" title="Permalink to this headline">¶</a></h2> <p>Besides generating output in different formats, the <a class="reference internal" href="#module-locale" title="locale: POSIX cultural localization API"><tt class="xref py py-mod docutils literal"><span class="pre">locale</span></tt></a> module helps with parsing input. It includes <tt class="xref py py-func docutils literal"><span class="pre">atoi()</span></tt> and <tt class="xref py py-func docutils literal"><span class="pre">atof()</span></tt> functions for converting the strings to integer and floating point values based on the locale’s numerical formatting conventions.</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">locale</span> <span class="n">sample_data</span> <span class="o">=</span> <span class="p">[</span> <span class="p">(</span><span class="s">'USA'</span><span class="p">,</span> <span class="s">'en_US'</span><span class="p">,</span> <span class="s">'1,234.56'</span><span class="p">),</span> <span class="p">(</span><span class="s">'France'</span><span class="p">,</span> <span class="s">'fr_FR'</span><span class="p">,</span> <span class="s">'1234,56'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Spain'</span><span class="p">,</span> <span class="s">'es_ES'</span><span class="p">,</span> <span class="s">'1234,56'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Portugal'</span><span class="p">,</span> <span class="s">'pt_PT'</span><span class="p">,</span> <span class="s">'1234.56'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Poland'</span><span class="p">,</span> <span class="s">'pl_PL'</span><span class="p">,</span> <span class="s">'1 234,56'</span><span class="p">),</span> <span class="p">]</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">loc</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">sample_data</span><span class="p">:</span> <span class="n">locale</span><span class="o">.</span><span class="n">setlocale</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">LC_ALL</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="n">f</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">atof</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="k">print</span> <span class="s">'</span><span class="si">%20s</span><span class="s">: </span><span class="si">%9s</span><span class="s"> => </span><span class="si">%f</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span> </pre></div> </div> <p>The grouping and decimal separator values</p> <div class="highlight-python"><pre>$ python locale_atof_example.py USA: 1,234.56 => 1234.560000 France: 1234,56 => 1234.560000 Spain: 1234,56 => 1234.560000 Portugal: 1234.56 => 1234.560000 Poland: 1 234,56 => 1234.560000</pre> </div> </div> <div class="section" id="dates-and-times"> <h2>Dates and Times<a class="headerlink" href="#dates-and-times" title="Permalink to this headline">¶</a></h2> <p>Another important aspect of localization is date and time formatting:</p> <div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">locale</span> <span class="kn">import</span> <span class="nn">time</span> <span class="n">sample_locales</span> <span class="o">=</span> <span class="p">[</span> <span class="p">(</span><span class="s">'USA'</span><span class="p">,</span> <span class="s">'en_US'</span><span class="p">),</span> <span class="p">(</span><span class="s">'France'</span><span class="p">,</span> <span class="s">'fr_FR'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Spain'</span><span class="p">,</span> <span class="s">'es_ES'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Portugal'</span><span class="p">,</span> <span class="s">'pt_PT'</span><span class="p">),</span> <span class="p">(</span><span class="s">'Poland'</span><span class="p">,</span> <span class="s">'pl_PL'</span><span class="p">),</span> <span class="p">]</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">loc</span> <span class="ow">in</span> <span class="n">sample_locales</span><span class="p">:</span> <span class="n">locale</span><span class="o">.</span><span class="n">setlocale</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">LC_ALL</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="k">print</span> <span class="s">'</span><span class="si">%20s</span><span class="s">: </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">nl_langinfo</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">D_T_FMT</span><span class="p">)))</span> </pre></div> </div> <div class="highlight-python"><pre>$ python locale_date_example.py USA: Sun Oct 24 08:53:42 2010 France: Dim 24 oct 08:53:42 2010 Spain: dom 24 oct 08:53:42 2010 Portugal: Dom 24 Out 08:53:42 2010 Poland: ndz 24 paź 08:53:42 2010</pre> </div> <p>This discussion only covers some of the high-level functions in the <a class="reference internal" href="#module-locale" title="locale: POSIX cultural localization API"><tt class="xref py py-mod docutils literal"><span class="pre">locale</span></tt></a> module. There are others which are lower level (<tt class="xref py py-func docutils literal"><span class="pre">format_string()</span></tt>) or which relate to managing the locale for your application (<tt class="xref py py-func docutils literal"><span class="pre">resetlocale()</span></tt>).</p> <div class="admonition-see-also admonition seealso"> <p class="first admonition-title">See also</p> <dl class="last docutils"> <dt><a class="reference external" href="http://docs.python.org/library/locale.html">locale</a></dt> <dd>The standard library documentation for this module.</dd> <dt><a class="reference internal" href="../gettext/index.html#module-gettext" title="gettext: Message Catalogs"><tt class="xref py py-mod docutils literal"><span class="pre">gettext</span></tt></a></dt> <dd>Message catalogs for translations.</dd> </dl> </div> </div> </div> </div> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="../genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > <a href="../frameworks.html" title="Program Frameworks" >next</a> |</li> <li class="right" > <a href="../gettext/index.html" title="gettext – Message Catalogs" >previous</a> |</li> <li><a href="../contents.html">PyMOTW</a> »</li> <li><a href="../i18n.html" >Internationalization</a> »</li> </ul> </div> <div class="footer"> © Copyright Doug Hellmann. Last updated on Oct 24, 2010. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a>. <br/><a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/" rel="license"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/us/88x31.png"/></a> </div> </body> </html>