@@ -520,6 +520,7 @@ def format_decimal(
520
520
format : str | NumberPattern | None = None ,
521
521
locale : Locale | str | None = LC_NUMERIC ,
522
522
decimal_quantization : bool = True ,
523
+ precision : int | None = None ,
523
524
group_separator : bool = True ,
524
525
* ,
525
526
numbering_system : Literal ["default" ] | str = "latn" ,
@@ -560,11 +561,19 @@ def format_decimal(
560
561
>>> format_decimal(12345.67, locale='en_US', group_separator=True)
561
562
u'12,345.67'
562
563
564
+ When you bypass locale truncation, you can specify precision:
565
+
566
+ >>> format_decimal(1.2346, locale='en_US', decimal_quantization=False, precision=2)
567
+ u'1.23'
568
+ >>> format_decimal(0.3, locale='en_US', decimal_quantization=False, precision=2)
569
+ u'0.30'
570
+
563
571
:param number: the number to format
564
572
:param format:
565
573
:param locale: the `Locale` object or locale identifier
566
574
:param decimal_quantization: Truncate and round high-precision numbers to
567
575
the format pattern. Defaults to `True`.
576
+ :param precision: Optionally specify precision when decimal_quantization is False.
568
577
:param group_separator: Boolean to switch group separator on/off in a locale's
569
578
number format.
570
579
:param numbering_system: The numbering system used for formatting number symbols. Defaults to "latn".
@@ -576,7 +585,7 @@ def format_decimal(
576
585
format = locale .decimal_formats [format ]
577
586
pattern = parse_pattern (format )
578
587
return pattern .apply (
579
- number , locale , decimal_quantization = decimal_quantization , group_separator = group_separator , numbering_system = numbering_system )
588
+ number , locale , decimal_quantization = decimal_quantization , precision = precision , group_separator = group_separator , numbering_system = numbering_system )
580
589
581
590
582
591
def format_compact_decimal (
@@ -674,6 +683,7 @@ def format_currency(
674
683
currency_digits : bool = True ,
675
684
format_type : Literal ["name" , "standard" , "accounting" ] = "standard" ,
676
685
decimal_quantization : bool = True ,
686
+ precision : int | None = None ,
677
687
group_separator : bool = True ,
678
688
* ,
679
689
numbering_system : Literal ["default" ] | str = "latn" ,
@@ -755,6 +765,11 @@ def format_currency(
755
765
>>> format_currency(1099.9876, 'USD', locale='en_US', decimal_quantization=False)
756
766
u'$1,099.9876'
757
767
768
+ When you bypass locale truncation, you can specify precision:
769
+
770
+ >>> format_currency(1099.9876, 'USD', locale='en_US', decimal_quantization=False, precision=3)
771
+ u'$1,099.988'
772
+
758
773
:param number: the number to format
759
774
:param currency: the currency code
760
775
:param format: the format string to use
@@ -763,6 +778,7 @@ def format_currency(
763
778
:param format_type: the currency format type to use
764
779
:param decimal_quantization: Truncate and round high-precision numbers to
765
780
the format pattern. Defaults to `True`.
781
+ :param precision: Optionally specify precision when decimal_quantization is False.
766
782
:param group_separator: Boolean to switch group separator on/off in a locale's
767
783
number format.
768
784
:param numbering_system: The numbering system used for formatting number symbols. Defaults to "latn".
@@ -772,7 +788,7 @@ def format_currency(
772
788
if format_type == 'name' :
773
789
return _format_currency_long_name (number , currency , format = format ,
774
790
locale = locale , currency_digits = currency_digits ,
775
- decimal_quantization = decimal_quantization , group_separator = group_separator ,
791
+ decimal_quantization = decimal_quantization , precision = precision , group_separator = group_separator ,
776
792
numbering_system = numbering_system )
777
793
locale = Locale .parse (locale )
778
794
if format :
@@ -785,7 +801,7 @@ def format_currency(
785
801
786
802
return pattern .apply (
787
803
number , locale , currency = currency , currency_digits = currency_digits ,
788
- decimal_quantization = decimal_quantization , group_separator = group_separator , numbering_system = numbering_system )
804
+ decimal_quantization = decimal_quantization , precision = precision , group_separator = group_separator , numbering_system = numbering_system )
789
805
790
806
791
807
def _format_currency_long_name (
@@ -796,6 +812,7 @@ def _format_currency_long_name(
796
812
currency_digits : bool = True ,
797
813
format_type : Literal ["name" , "standard" , "accounting" ] = "standard" ,
798
814
decimal_quantization : bool = True ,
815
+ precision : int | None = None ,
799
816
group_separator : bool = True ,
800
817
* ,
801
818
numbering_system : Literal ["default" ] | str = "latn" ,
@@ -825,7 +842,7 @@ def _format_currency_long_name(
825
842
826
843
number_part = pattern .apply (
827
844
number , locale , currency = currency , currency_digits = currency_digits ,
828
- decimal_quantization = decimal_quantization , group_separator = group_separator , numbering_system = numbering_system )
845
+ decimal_quantization = decimal_quantization , precision = precision , group_separator = group_separator , numbering_system = numbering_system )
829
846
830
847
return unit_pattern .format (number_part , display_name )
831
848
@@ -887,6 +904,7 @@ def format_percent(
887
904
format : str | NumberPattern | None = None ,
888
905
locale : Locale | str | None = LC_NUMERIC ,
889
906
decimal_quantization : bool = True ,
907
+ precision : int | None = None ,
890
908
group_separator : bool = True ,
891
909
* ,
892
910
numbering_system : Literal ["default" ] | str = "latn" ,
@@ -922,11 +940,17 @@ def format_percent(
922
940
>>> format_percent(229291.1234, locale='pt_BR', group_separator=True)
923
941
u'22.929.112%'
924
942
943
+ When you bypass locale truncation, you can specify precision:
944
+
945
+ >>> format_percent(0.0111, locale='en_US', decimal_quantization=False, precision=3)
946
+ u'1.110%'
947
+
925
948
:param number: the percent number to format
926
949
:param format:
927
950
:param locale: the `Locale` object or locale identifier
928
951
:param decimal_quantization: Truncate and round high-precision numbers to
929
952
the format pattern. Defaults to `True`.
953
+ :param precision: Optionally specify precision when decimal_quantization is False.
930
954
:param group_separator: Boolean to switch group separator on/off in a locale's
931
955
number format.
932
956
:param numbering_system: The numbering system used for formatting number symbols. Defaults to "latn".
@@ -938,7 +962,7 @@ def format_percent(
938
962
format = locale .percent_formats [None ]
939
963
pattern = parse_pattern (format )
940
964
return pattern .apply (
941
- number , locale , decimal_quantization = decimal_quantization , group_separator = group_separator ,
965
+ number , locale , decimal_quantization = decimal_quantization , precision = precision , group_separator = group_separator ,
942
966
numbering_system = numbering_system ,
943
967
)
944
968
@@ -949,6 +973,7 @@ def format_scientific(
949
973
locale : Locale | str | None = LC_NUMERIC ,
950
974
decimal_quantization : bool = True ,
951
975
* ,
976
+ precision : int | None = None ,
952
977
numbering_system : Literal ["default" ] | str = "latn" ,
953
978
) -> str :
954
979
"""Return value formatted in scientific notation for a specific locale.
@@ -972,11 +997,17 @@ def format_scientific(
972
997
>>> format_scientific(1234.9876, u'#.##E0', locale='en_US', decimal_quantization=False)
973
998
u'1.2349876E3'
974
999
1000
+ When you bypass locale truncation, you can specify precision:
1001
+
1002
+ >>> format_scientific(000.00100, locale='en_US', decimal_quantization=False, precision=3)
1003
+ u'1.000E-3'
1004
+
975
1005
:param number: the number to format
976
1006
:param format:
977
1007
:param locale: the `Locale` object or locale identifier
978
1008
:param decimal_quantization: Truncate and round high-precision numbers to
979
1009
the format pattern. Defaults to `True`.
1010
+ :param precision: Optionally specify precision when decimal_quantization is False.
980
1011
:param numbering_system: The numbering system used for formatting number symbols. Defaults to "latn".
981
1012
The special value "default" will use the default numbering system of the locale.
982
1013
:raise `UnsupportedNumberingSystemError`: If the numbering system is not supported by the locale.
@@ -986,7 +1017,7 @@ def format_scientific(
986
1017
format = locale .scientific_formats [None ]
987
1018
pattern = parse_pattern (format )
988
1019
return pattern .apply (
989
- number , locale , decimal_quantization = decimal_quantization , numbering_system = numbering_system )
1020
+ number , locale , decimal_quantization = decimal_quantization , precision = precision , numbering_system = numbering_system )
990
1021
991
1022
992
1023
class NumberFormatError (ValueError ):
@@ -1346,6 +1377,7 @@ def apply(
1346
1377
currency : str | None = None ,
1347
1378
currency_digits : bool = True ,
1348
1379
decimal_quantization : bool = True ,
1380
+ precision : int | None = None ,
1349
1381
force_frac : tuple [int , int ] | None = None ,
1350
1382
group_separator : bool = True ,
1351
1383
* ,
@@ -1371,6 +1403,8 @@ def apply(
1371
1403
strictly matching the CLDR definition for
1372
1404
the locale.
1373
1405
:type decimal_quantization: bool
1406
+ :param precision: Optionally specify precision when decimal_quantization is False.
1407
+ :type precision: int|None
1374
1408
:param force_frac: DEPRECATED - a forced override for `self.frac_prec`
1375
1409
for a single formatting invocation.
1376
1410
:param numbering_system: The numbering system used for formatting number symbols. Defaults to "latn".
@@ -1407,14 +1441,20 @@ def apply(
1407
1441
else :
1408
1442
frac_prec = self .frac_prec
1409
1443
1444
+ if decimal_quantization and precision is not None :
1445
+ raise ValueError ("To specify precision, decimal_quantization should be set to False." )
1446
+
1410
1447
# Bump decimal precision to the natural precision of the number if it
1411
1448
# exceeds the one we're about to use. This adaptative precision is only
1412
1449
# triggered if the decimal quantization is disabled or if a scientific
1413
1450
# notation pattern has a missing mandatory fractional part (as in the
1414
1451
# default '#E0' pattern). This special case has been extensively
1415
1452
# discussed at https://github.com/python-babel/babel/pull/494#issuecomment-307649969 .
1416
1453
if not decimal_quantization or (self .exp_prec and frac_prec == (0 , 0 )):
1417
- frac_prec = (frac_prec [0 ], max ([frac_prec [1 ], get_decimal_precision (value )]))
1454
+ if not decimal_quantization and precision is not None :
1455
+ frac_prec = (precision , precision )
1456
+ else :
1457
+ frac_prec = (frac_prec [0 ], max ([frac_prec [1 ], get_decimal_precision (value )]))
1418
1458
1419
1459
# Render scientific notation.
1420
1460
if self .exp_prec :
0 commit comments