@@ -373,7 +373,7 @@ def get_decimal_quantum(precision):
373
373
374
374
375
375
def format_decimal (
376
- number , format = None , locale = LC_NUMERIC , decimal_quantization = True ):
376
+ number , format = None , locale = LC_NUMERIC , decimal_quantization = True , group_separator = True ):
377
377
u"""Return the given decimal number formatted for a specific locale.
378
378
379
379
>>> format_decimal(1.2345, locale='en_US')
@@ -401,19 +401,25 @@ def format_decimal(
401
401
u'1.235'
402
402
>>> format_decimal(1.2346, locale='en_US', decimal_quantization=False)
403
403
u'1.2346'
404
+ >>> format_decimal(12345.67, locale='fr_CA', group_separator=False)
405
+ u'12345,67'
406
+ >>> format_decimal(12345.67, locale='en_US', group_separator=True)
407
+ u'12,345.67'
404
408
405
409
:param number: the number to format
406
410
:param format:
407
411
:param locale: the `Locale` object or locale identifier
408
412
:param decimal_quantization: Truncate and round high-precision numbers to
409
413
the format pattern. Defaults to `True`.
414
+ :param group_separator: Boolean to switch group separator on/off in a locale's
415
+ number format.
410
416
"""
411
417
locale = Locale .parse (locale )
412
418
if not format :
413
419
format = locale .decimal_formats .get (format )
414
420
pattern = parse_pattern (format )
415
421
return pattern .apply (
416
- number , locale , decimal_quantization = decimal_quantization )
422
+ number , locale , decimal_quantization = decimal_quantization , group_separator = group_separator )
417
423
418
424
419
425
class UnknownCurrencyFormatError (KeyError ):
@@ -422,7 +428,7 @@ class UnknownCurrencyFormatError(KeyError):
422
428
423
429
def format_currency (
424
430
number , currency , format = None , locale = LC_NUMERIC , currency_digits = True ,
425
- format_type = 'standard' , decimal_quantization = True ):
431
+ format_type = 'standard' , decimal_quantization = True , group_separator = True ):
426
432
u"""Return formatted currency value.
427
433
428
434
>>> format_currency(1099.98, 'USD', locale='en_US')
@@ -472,6 +478,12 @@ def format_currency(
472
478
...
473
479
UnknownCurrencyFormatError: "'unknown' is not a known currency format type"
474
480
481
+ >>> format_currency(101299.98, 'USD', locale='en_US', group_separator=False)
482
+ u'$101299.98'
483
+
484
+ >>> format_currency(101299.98, 'USD', locale='en_US', group_separator=True)
485
+ u'$101,299.98'
486
+
475
487
You can also pass format_type='name' to use long display names. The order of
476
488
the number and currency name, along with the correct localized plural form
477
489
of the currency name, is chosen according to locale:
@@ -500,12 +512,14 @@ def format_currency(
500
512
:param format_type: the currency format type to use
501
513
:param decimal_quantization: Truncate and round high-precision numbers to
502
514
the format pattern. Defaults to `True`.
515
+ :param group_separator: Boolean to switch group separator on/off in a locale's
516
+ number format.
503
517
504
518
"""
505
519
if format_type == 'name' :
506
520
return _format_currency_long_name (number , currency , format = format ,
507
521
locale = locale , currency_digits = currency_digits ,
508
- decimal_quantization = decimal_quantization )
522
+ decimal_quantization = decimal_quantization , group_separator = group_separator )
509
523
locale = Locale .parse (locale )
510
524
if format :
511
525
pattern = parse_pattern (format )
@@ -518,12 +532,12 @@ def format_currency(
518
532
519
533
return pattern .apply (
520
534
number , locale , currency = currency , currency_digits = currency_digits ,
521
- decimal_quantization = decimal_quantization )
535
+ decimal_quantization = decimal_quantization , group_separator = group_separator )
522
536
523
537
524
538
def _format_currency_long_name (
525
539
number , currency , format = None , locale = LC_NUMERIC , currency_digits = True ,
526
- format_type = 'standard' , decimal_quantization = True ):
540
+ format_type = 'standard' , decimal_quantization = True , group_separator = True ):
527
541
# Algorithm described here:
528
542
# https://www.unicode.org/reports/tr35/tr35-numbers.html#Currencies
529
543
locale = Locale .parse (locale )
@@ -552,13 +566,13 @@ def _format_currency_long_name(
552
566
553
567
number_part = pattern .apply (
554
568
number , locale , currency = currency , currency_digits = currency_digits ,
555
- decimal_quantization = decimal_quantization )
569
+ decimal_quantization = decimal_quantization , group_separator = group_separator )
556
570
557
571
return unit_pattern .format (number_part , display_name )
558
572
559
573
560
574
def format_percent (
561
- number , format = None , locale = LC_NUMERIC , decimal_quantization = True ):
575
+ number , format = None , locale = LC_NUMERIC , decimal_quantization = True , group_separator = True ):
562
576
"""Return formatted percent value for a specific locale.
563
577
564
578
>>> format_percent(0.34, locale='en_US')
@@ -582,18 +596,26 @@ def format_percent(
582
596
>>> format_percent(23.9876, locale='en_US', decimal_quantization=False)
583
597
u'2,398.76%'
584
598
599
+ >>> format_percent(229291.1234, locale='pt_BR', group_separator=False)
600
+ u'22929112%'
601
+
602
+ >>> format_percent(229291.1234, locale='pt_BR', group_separator=True)
603
+ u'22.929.112%'
604
+
585
605
:param number: the percent number to format
586
606
:param format:
587
607
:param locale: the `Locale` object or locale identifier
588
608
:param decimal_quantization: Truncate and round high-precision numbers to
589
609
the format pattern. Defaults to `True`.
610
+ :param group_separator: Boolean to switch group separator on/off in a locale's
611
+ number format.
590
612
"""
591
613
locale = Locale .parse (locale )
592
614
if not format :
593
615
format = locale .percent_formats .get (format )
594
616
pattern = parse_pattern (format )
595
617
return pattern .apply (
596
- number , locale , decimal_quantization = decimal_quantization )
618
+ number , locale , decimal_quantization = decimal_quantization , group_separator = group_separator )
597
619
598
620
599
621
def format_scientific (
@@ -913,6 +935,7 @@ def apply(
913
935
currency_digits = True ,
914
936
decimal_quantization = True ,
915
937
force_frac = None ,
938
+ group_separator = True ,
916
939
):
917
940
"""Renders into a string a number following the defined pattern.
918
941
@@ -952,8 +975,8 @@ def apply(
952
975
if self .exp_prec :
953
976
value , exp , exp_sign = self .scientific_notation_elements (value , locale )
954
977
955
- # Adjust the precision of the fractionnal part and force it to the
956
- # currency's if neccessary .
978
+ # Adjust the precision of the fractional part and force it to the
979
+ # currency's if necessary .
957
980
if force_frac :
958
981
# TODO (3.x?): Remove this parameter
959
982
warnings .warn ('The force_frac parameter to NumberPattern.apply() is deprecated.' , DeprecationWarning )
@@ -975,7 +998,7 @@ def apply(
975
998
# Render scientific notation.
976
999
if self .exp_prec :
977
1000
number = '' .join ([
978
- self ._quantize_value (value , locale , frac_prec ),
1001
+ self ._quantize_value (value , locale , frac_prec , group_separator ),
979
1002
get_exponential_symbol (locale ),
980
1003
exp_sign ,
981
1004
self ._format_int (
@@ -993,7 +1016,7 @@ def apply(
993
1016
994
1017
# A normal number pattern.
995
1018
else :
996
- number = self ._quantize_value (value , locale , frac_prec )
1019
+ number = self ._quantize_value (value , locale , frac_prec , group_separator )
997
1020
998
1021
retval = '' .join ([
999
1022
self .prefix [is_negative ],
@@ -1060,13 +1083,14 @@ def _format_int(self, value, min, max, locale):
1060
1083
gsize = self .grouping [1 ]
1061
1084
return value + ret
1062
1085
1063
- def _quantize_value (self , value , locale , frac_prec ):
1086
+ def _quantize_value (self , value , locale , frac_prec , group_separator ):
1064
1087
quantum = get_decimal_quantum (frac_prec [1 ])
1065
1088
rounded = value .quantize (quantum )
1066
1089
a , sep , b = "{:f}" .format (rounded ).partition ("." )
1067
- number = (self ._format_int (a , self .int_prec [0 ],
1068
- self .int_prec [1 ], locale ) +
1069
- self ._format_frac (b or '0' , locale , frac_prec ))
1090
+ integer_part = a
1091
+ if group_separator :
1092
+ integer_part = self ._format_int (a , self .int_prec [0 ], self .int_prec [1 ], locale )
1093
+ number = integer_part + self ._format_frac (b or '0' , locale , frac_prec )
1070
1094
return number
1071
1095
1072
1096
def _format_frac (self , value , locale , force_frac = None ):
0 commit comments