---
slug: "alpine-linux-decimal-field-quantize-failed"
title: "When Django's DecimalField quantize Fails on Alpine Linux"
description: "Stop PyCharm / JetBrains project view from opening files on a single click — how to require a double click instead."
url: "https://www.ytyng.com/en/blog/alpine-linux-decimal-field-quantize-failed"
publish_date: "2019-06-22T13:07:19Z"
created: "2019-06-22T13:07:19Z"
updated: "2026-05-11T13:21:51.077Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/6497da9f8aa44c8390c979949901a0e3.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "en"
---

# When Django's DecimalField quantize Fails on Alpine Linux

<p>Failed to run tests for Django Cartridge in an Alpine Docker environment</p>
<pre>  File "/var/src/venv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 958, in prepare_value<br />    value = field.get_db_prep_save(value, connection=self.connection)<br />  File "/var/src/venv/lib/python3.6/site-packages/django/db/models/fields/<span>__</span>init<span>__</span>.py", line 1612, in get_db_prep_save<br />    self.max_digits, self.decimal_places)<br />  File "/var/src/venv/lib/python3.6/site-packages/django/db/backends/base/operations.py", line 493, in adapt_decimalfield_value<br />    return utils.format_number(value, max_digits, decimal_places)<br />  File "/var/src/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 200, in format_number<br />    value = value.quantize(decimal.Decimal(".1") ** decimal_places, context=context)<br />decimal.InvalidOperation: <span>[&lt;class 'decimal.InvalidOperation'&gt;]<br /></span><span></span></pre>
<pre>InvalidOperation: <span>[&lt;class 'decimal.InvalidOperation'&gt;]<br /></span><span></span></pre>
<p><span><br /></span>was encountered.<br /><br />Upon investigation, it was found that<br /><br />decimal_places was set to 127.<br /><br />(In another test environment, it was set to 0, and the tests passed)<br /><br />decimal_places is determined by<br /><br /></p>
<pre>./manage.py shell<br /><br />from locale import localeconv; localeconv()</pre>
<pre>{'currency_symbol': '&yen;',<br /> 'decimal_point': '.',<br /> 'frac_digits': 0,<br /> 'grouping': [],<br /> 'int_curr_symbol': 'JPY ',<br /> 'int_frac_digits': 0,<br /> 'mon_decimal_point': '.',<br /> 'mon_grouping': <span>[3, 3, 0]</span>,<br /> 'mon_thousands_sep': ',',<br /> 'n_cs_precedes': 1,<br /> 'n_sep_by_space': 0,<br /> 'n_sign_posn': 4,<br /> 'negative_sign': '-',<br /> 'p_cs_precedes': 1,<br /> 'p_sep_by_space': 0,<br /> 'p_sign_posn': 1,<br /> 'positive_sign': '',<br /> 'thousands_sep': ''}</pre>
<p>This uses the frac_digits value.<br /><br />In the environment where the test fails:<br /><br /></p>
<pre> {'currency_symbol': '',<br /> 'decimal_point': '.',<br /> 'frac_digits': 127,<br /> 'grouping': [],<br /> 'int_curr_symbol': '',<br /> 'int_frac_digits': 127,<br /> 'mon_decimal_point': '',<br /> 'mon_grouping': [],<br /> 'mon_thousands_sep': '',<br /> 'n_cs_precedes': 127,<br /> 'n_sep_by_space': 127,<br /> 'n_sign_posn': 127,<br /> 'negative_sign': '',<br /> 'p_cs_precedes': 127,<br /> 'p_sep_by_space': 127,<br /> 'p_sign_posn': 127,<br /> 'positive_sign': '',<br /> 'thousands_sep': ''}</pre>
<p><br />The locale settings seem to be insufficient.<br /><br /><br /><br />I tried to create the musl-locales by writing the Dockerfile as follows:<br /><br /></p>
<pre>ENV MUSL_LOCPATH="/usr/share/i18n/locales/musl"<br /><br />RUN apk --no-cache add libintl &amp;&amp; \<br />   apk --no-cache --virtual .locale_build add cmake make musl-dev gcc gettext-dev git &amp;&amp; \<br />   git clone https://gitlab.com/ytyng/musl-locales &amp;&amp; \<br />   cd musl-locales &amp;&amp; cmake -DLOCALE_PROFILE=OFF -DCMAKE_INSTALL_PREFIX:PATH=/usr . &amp;&amp; make &amp;&amp; make install &amp;&amp; \<br />   cd .. &amp;&amp; rm -r musl-locales &amp;&amp; \<br />   apk del .locale_build</pre>
<p><br />However, the int_frac_digits value did not change.<br /><br />Since I couldn't figure out another way, I patched<br />the locale settings in Django as follows:<br /><br /></p>
<pre>setattr(locale, '_override_localeconv',<br />        {'currency_symbol': '&yen;',<br />         'decimal_point': '.',<br />         'frac_digits': 0,<br />         'grouping': [],<br />         'int_curr_symbol': 'JPY ',<br />         'int_frac_digits': 0,<br />         'mon_decimal_point': '.',<br />         'mon_grouping': <span>[3, 3, 0]</span>,<br />         'mon_thousands_sep': ',',<br />         'n_cs_precedes': 1,<br />         'n_sep_by_space': 0,<br />         'n_sign_posn': 4,<br />         'negative_sign': '-',<br />         'p_cs_precedes': 1,<br />         'p_sep_by_space': 0,<br />         'p_sign_posn': 1,<br />         'positive_sign': '',<br />         'thousands_sep': ''})</pre>
<p><br />By patching locale._override_localeconv in this way, the tests passed successfully.</p>
<p></p>
<p>In environments dealing with locales, it might be better to use Debian or similar instead of Alpine Linux.</p>
