Parcourir la source

Add FmtNumber function + logic.

joeybloggs il y a 9 ans
Parent
commit
7639a43974
100 fichiers modifiés avec 412 ajouts et 161 suppressions
  1. 1 0
      af/af.go
  2. 1 0
      af_NA/af_NA.go
  3. 1 0
      af_ZA/af_ZA.go
  4. 5 1
      agq/agq.go
  5. 5 1
      agq_CM/agq_CM.go
  6. 1 0
      ak/ak.go
  7. 1 0
      ak_GH/ak_GH.go
  8. 1 0
      am/am.go
  9. 1 0
      am_ET/am_ET.go
  10. 54 0
      ar/ar.go
  11. 1 0
      ar_001/ar_001.go
  12. 1 0
      ar_AE/ar_AE.go
  13. 1 0
      ar_BH/ar_BH.go
  14. 1 0
      ar_DJ/ar_DJ.go
  15. 1 0
      ar_DZ/ar_DZ.go
  16. 1 0
      ar_EG/ar_EG.go
  17. 1 0
      ar_EH/ar_EH.go
  18. 1 0
      ar_ER/ar_ER.go
  19. 1 0
      ar_IL/ar_IL.go
  20. 1 0
      ar_IQ/ar_IQ.go
  21. 1 0
      ar_JO/ar_JO.go
  22. 1 0
      ar_KM/ar_KM.go
  23. 1 0
      ar_KW/ar_KW.go
  24. 1 0
      ar_LB/ar_LB.go
  25. 1 0
      ar_LY/ar_LY.go
  26. 1 0
      ar_MA/ar_MA.go
  27. 1 0
      ar_MR/ar_MR.go
  28. 1 0
      ar_OM/ar_OM.go
  29. 1 0
      ar_PS/ar_PS.go
  30. 1 0
      ar_QA/ar_QA.go
  31. 1 0
      ar_SA/ar_SA.go
  32. 1 0
      ar_SD/ar_SD.go
  33. 1 0
      ar_SO/ar_SO.go
  34. 1 0
      ar_SS/ar_SS.go
  35. 1 0
      ar_SY/ar_SY.go
  36. 1 0
      ar_TD/ar_TD.go
  37. 1 0
      ar_TN/ar_TN.go
  38. 1 0
      ar_YE/ar_YE.go
  39. 1 0
      as/as.go
  40. 1 0
      as_IN/as_IN.go
  41. 1 0
      asa/asa.go
  42. 1 0
      asa_TZ/asa_TZ.go
  43. 1 0
      ast/ast.go
  44. 1 0
      ast_ES/ast_ES.go
  45. 1 0
      az/az.go
  46. 1 0
      az_Cyrl/az_Cyrl.go
  47. 1 0
      az_Cyrl_AZ/az_Cyrl_AZ.go
  48. 1 0
      az_Latn/az_Latn.go
  49. 1 0
      az_Latn_AZ/az_Latn_AZ.go
  50. 5 1
      bas/bas.go
  51. 5 1
      bas_CM/bas_CM.go
  52. 1 0
      be/be.go
  53. 1 0
      be_BY/be_BY.go
  54. 1 0
      bem/bem.go
  55. 1 0
      bem_ZM/bem_ZM.go
  56. 1 0
      bez/bez.go
  57. 1 0
      bez_TZ/bez_TZ.go
  58. 1 0
      bg/bg.go
  59. 1 0
      bg_BG/bg_BG.go
  60. 5 1
      bm/bm.go
  61. 5 1
      bm_ML/bm_ML.go
  62. 1 0
      bn/bn.go
  63. 1 0
      bn_BD/bn_BD.go
  64. 1 0
      bn_IN/bn_IN.go
  65. 5 1
      bo/bo.go
  66. 5 1
      bo_CN/bo_CN.go
  67. 5 1
      bo_IN/bo_IN.go
  68. 1 0
      br/br.go
  69. 1 0
      br_FR/br_FR.go
  70. 1 0
      brx/brx.go
  71. 1 0
      brx_IN/brx_IN.go
  72. 1 0
      bs/bs.go
  73. 1 0
      bs_Cyrl/bs_Cyrl.go
  74. 1 0
      bs_Cyrl_BA/bs_Cyrl_BA.go
  75. 1 0
      bs_Latn/bs_Latn.go
  76. 1 0
      bs_Latn_BA/bs_Latn_BA.go
  77. 1 0
      ca/ca.go
  78. 1 0
      ca_AD/ca_AD.go
  79. 1 0
      ca_ES/ca_ES.go
  80. 1 0
      ca_ES_VALENCIA/ca_ES_VALENCIA.go
  81. 1 0
      ca_FR/ca_FR.go
  82. 1 0
      ca_IT/ca_IT.go
  83. 1 0
      ce/ce.go
  84. 1 0
      ce_RU/ce_RU.go
  85. 1 0
      cgg/cgg.go
  86. 1 0
      cgg_UG/cgg_UG.go
  87. 1 0
      chr/chr.go
  88. 1 0
      chr_US/chr_US.go
  89. 1 0
      ckb/ckb.go
  90. 1 0
      ckb_IQ/ckb_IQ.go
  91. 1 0
      ckb_IR/ckb_IR.go
  92. 90 150
      cmd/generate_resources.go
  93. 74 0
      cmd/translator.tmpl
  94. 1 0
      cs/cs.go
  95. 1 0
      cs_CZ/cs_CZ.go
  96. 5 1
      cu/cu.go
  97. 5 1
      cu_RU/cu_RU.go
  98. 54 0
      cy/cy.go
  99. 1 0
      cy_GB/cy_GB.go
  100. 1 0
      da/da.go

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
af/af.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
af_NA/af_NA.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
af_ZA/af_ZA.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
agq/agq.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
agq_CM/agq_CM.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ak/ak.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ak_GH/ak_GH.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
am/am.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
am_ET/am_ET.go


+ 54 - 0
ar/ar.go

@@ -2,6 +2,7 @@ package ar
 
 import (
 	"math"
+	"strconv"
 
 	"github.com/go-playground/locales"
 )
@@ -129,3 +130,56 @@ func (ar *ar) RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64)
 	return locales.PluralRuleOther
 
 }
+
+// FmtNumber returns 'num' with digits/precision of 'v' for 'ar' and handles both Whole and Real numbers based on 'v'
+// returned as a []byte just in case the caller wishes to add more and can help
+// avoid allocations; otherwise just cast as string.
+func (ar *ar) FmtNumber(num float64, v uint64) []byte {
+
+	s := strconv.FormatFloat(num, 'f', int(v), 64)
+
+	l := len(s) + len(ar.decimal) + len(ar.group)*len(s[:len(s)-int(v)-1])/3
+
+	count := 0
+	inWhole := v == 0
+
+	b := make([]byte, 0, l)
+
+	for i := len(s) - 1; i >= 0; i-- {
+
+		if s[i] == '.' {
+
+			for j := len(ar.decimal) - 1; j >= 0; j-- {
+				b = append(b, ar.decimal[j])
+			}
+
+			inWhole = true
+
+			continue
+		}
+
+		if inWhole {
+
+			if count == 3 {
+
+				for j := len(ar.group) - 1; j >= 0; j-- {
+					b = append(b, ar.group[j])
+				}
+
+				count = 1
+			} else {
+				count++
+			}
+		}
+
+		b = append(b, s[i])
+	}
+
+	// reverse
+	for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
+		b[i], b[j] = b[j], b[i]
+	}
+
+	return b
+
+}

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_001/ar_001.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_AE/ar_AE.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_BH/ar_BH.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_DJ/ar_DJ.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_DZ/ar_DZ.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_EG/ar_EG.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_EH/ar_EH.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_ER/ar_ER.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_IL/ar_IL.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_IQ/ar_IQ.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_JO/ar_JO.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_KM/ar_KM.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_KW/ar_KW.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_LB/ar_LB.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_LY/ar_LY.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_MA/ar_MA.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_MR/ar_MR.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_OM/ar_OM.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_PS/ar_PS.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_QA/ar_QA.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_SA/ar_SA.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_SD/ar_SD.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_SO/ar_SO.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_SS/ar_SS.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_SY/ar_SY.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_TD/ar_TD.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_TN/ar_TN.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ar_YE/ar_YE.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
as/as.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
as_IN/as_IN.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
asa/asa.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
asa_TZ/asa_TZ.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ast/ast.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ast_ES/ast_ES.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
az/az.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
az_Cyrl/az_Cyrl.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
az_Cyrl_AZ/az_Cyrl_AZ.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
az_Latn/az_Latn.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
az_Latn_AZ/az_Latn_AZ.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
bas/bas.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
bas_CM/bas_CM.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
be/be.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
be_BY/be_BY.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bem/bem.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bem_ZM/bem_ZM.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bez/bez.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bez_TZ/bez_TZ.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bg/bg.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bg_BG/bg_BG.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
bm/bm.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
bm_ML/bm_ML.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bn/bn.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bn_BD/bn_BD.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bn_IN/bn_IN.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
bo/bo.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
bo_CN/bo_CN.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
bo_IN/bo_IN.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
br/br.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
br_FR/br_FR.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
brx/brx.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
brx_IN/brx_IN.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bs/bs.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bs_Cyrl/bs_Cyrl.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bs_Cyrl_BA/bs_Cyrl_BA.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bs_Latn/bs_Latn.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
bs_Latn_BA/bs_Latn_BA.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ca/ca.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ca_AD/ca_AD.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ca_ES/ca_ES.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ca_ES_VALENCIA/ca_ES_VALENCIA.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ca_FR/ca_FR.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ca_IT/ca_IT.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ce/ce.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ce_RU/ce_RU.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
cgg/cgg.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
cgg_UG/cgg_UG.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
chr/chr.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
chr_US/chr_US.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ckb/ckb.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ckb_IQ/ckb_IQ.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
ckb_IR/ckb_IR.go


+ 90 - 150
cmd/generate_resources.go

@@ -31,17 +31,20 @@ var (
 		"t": "t := locales.T(n, v)\n",
 	}
 
-	translators         = make(map[string]*translator)
-	baseTranslators     = make(map[string]*translator)
-	globalCurrenciesMap = make(map[string]struct{}) // ["USD"] = "$" currency code, just all currencies for mapping to enum
-	globCurrencyIdxMap  = make(map[string]int)      // ["USD"] = 0
-	globalCurrencies    = make([]string, 0, 100)    // array of currency codes index maps to enum
-	tmpl                *template.Template
-	nModRegex           = regexp.MustCompile("(n%[0-9]+)")
-	iModRegex           = regexp.MustCompile("(i%[0-9]+)")
-	wModRegex           = regexp.MustCompile("(w%[0-9]+)")
-	fModRegex           = regexp.MustCompile("(f%[0-9]+)")
-	tModRegex           = regexp.MustCompile("(t%[0-9]+)")
+	translators          = make(map[string]*translator)
+	baseTranslators      = make(map[string]*translator)
+	globalCurrenciesMap  = make(map[string]struct{}) // ["USD"] = "$" currency code, just all currencies for mapping to enum
+	globCurrencyIdxMap   = make(map[string]int)      // ["USD"] = 0
+	globalCurrencies     = make([]string, 0, 100)    // array of currency codes index maps to enum
+	tmpl                 *template.Template
+	nModRegex            = regexp.MustCompile("(n%[0-9]+)")
+	iModRegex            = regexp.MustCompile("(i%[0-9]+)")
+	wModRegex            = regexp.MustCompile("(w%[0-9]+)")
+	fModRegex            = regexp.MustCompile("(f%[0-9]+)")
+	tModRegex            = regexp.MustCompile("(t%[0-9]+)")
+	groupLenRegex        = regexp.MustCompile(",([0-9#]+)\\.")
+	requiredNumRegex     = regexp.MustCompile("([0-9]+)\\.")
+	requiredDecimalRegex = regexp.MustCompile("\\.([0-9]+)")
 )
 
 type translator struct {
@@ -58,6 +61,13 @@ type translator struct {
 	Percent        string
 	PerMille       string
 	Currencies     string
+	// FmtNumberFunc  string
+	FmtNumberExists        bool
+	FmtNumberGroupLen      int
+	FmtNumberMinDecimalLen int
+
+	// calculation only fields
+	DecimalNumberFormat string
 }
 
 func main() {
@@ -234,6 +244,14 @@ func postProcess(cldr *cldr.CLDR) {
 		// Currency
 
 		// number values
+
+		if len(trans.DecimalNumberFormat) == 0 {
+
+			if found {
+				trans.DecimalNumberFormat = base.DecimalNumberFormat
+			}
+		}
+
 		ldml := cldr.RawLDML(trans.Locale)
 
 		currencies := make([][]byte, len(globalCurrencies), len(globalCurrencies))
@@ -243,27 +261,32 @@ func postProcess(cldr *cldr.CLDR) {
 		}
 
 		// some just have no data...
-		if ldml.Numbers != nil && ldml.Numbers.Currencies != nil {
+		if ldml.Numbers != nil {
 
-			for _, currency := range ldml.Numbers.Currencies.Currency {
+			if ldml.Numbers.Currencies != nil {
+				for _, currency := range ldml.Numbers.Currencies.Currency {
 
-				if len(currency.Symbol) == 0 {
-					continue
-				}
+					if len(currency.Symbol) == 0 {
+						continue
+					}
 
-				if len(currency.Symbol[0].Data()) == 0 {
-					continue
-				}
+					if len(currency.Symbol[0].Data()) == 0 {
+						continue
+					}
 
-				if len(currency.Type) == 0 {
-					continue
-				}
+					if len(currency.Type) == 0 {
+						continue
+					}
 
-				currencies[globCurrencyIdxMap[currency.Type]] = []byte(currency.Symbol[0].Data())
+					currencies[globCurrencyIdxMap[currency.Type]] = []byte(currency.Symbol[0].Data())
+				}
 			}
 		}
 
 		trans.Currencies = fmt.Sprintf("%#v", currencies)
+
+		parseDecimalNumberFormat(trans)
+		// trans.FmtNumberFunc = parseDecimalNumberFormat(trans.DecimalNumberFormat, trans.BaseLocale)
 	}
 }
 
@@ -295,24 +318,27 @@ func preProcess(cldr *cldr.CLDR) {
 		ldml := cldr.RawLDML(l)
 
 		// some just have no data...
-		if ldml.Numbers != nil && len(ldml.Numbers.Symbols) > 0 {
+		if ldml.Numbers != nil {
 
-			symbol := ldml.Numbers.Symbols[0]
+			if len(ldml.Numbers.Symbols) > 0 {
 
-			if len(symbol.Decimal) > 0 {
-				trans.Decimal = fmt.Sprintf("%#v", []byte(symbol.Decimal[0].Data()))
-			}
-			if len(symbol.Group) > 0 {
-				trans.Group = fmt.Sprintf("%#v", []byte(symbol.Group[0].Data()))
-			}
-			if len(symbol.MinusSign) > 0 {
-				trans.Minus = fmt.Sprintf("%#v", []byte(symbol.MinusSign[0].Data()))
-			}
-			if len(symbol.PercentSign) > 0 {
-				trans.Percent = fmt.Sprintf("%#v", []byte(symbol.PercentSign[0].Data()))
-			}
-			if len(symbol.PerMille) > 0 {
-				trans.PerMille = fmt.Sprintf("%#v", []byte(symbol.PerMille[0].Data()))
+				symbol := ldml.Numbers.Symbols[0]
+
+				if len(symbol.Decimal) > 0 {
+					trans.Decimal = fmt.Sprintf("%#v", []byte(symbol.Decimal[0].Data()))
+				}
+				if len(symbol.Group) > 0 {
+					trans.Group = fmt.Sprintf("%#v", []byte(symbol.Group[0].Data()))
+				}
+				if len(symbol.MinusSign) > 0 {
+					trans.Minus = fmt.Sprintf("%#v", []byte(symbol.MinusSign[0].Data()))
+				}
+				if len(symbol.PercentSign) > 0 {
+					trans.Percent = fmt.Sprintf("%#v", []byte(symbol.PercentSign[0].Data()))
+				}
+				if len(symbol.PerMille) > 0 {
+					trans.PerMille = fmt.Sprintf("%#v", []byte(symbol.PerMille[0].Data()))
+				}
 			}
 
 			if ldml.Numbers.Currencies != nil {
@@ -327,6 +353,16 @@ func preProcess(cldr *cldr.CLDR) {
 				}
 			}
 
+			if len(ldml.Numbers.DecimalFormats) > 0 && len(ldml.Numbers.DecimalFormats[0].DecimalFormatLength) > 0 {
+
+				for _, dfl := range ldml.Numbers.DecimalFormats[0].DecimalFormatLength {
+					if len(dfl.Type) == 0 {
+						trans.DecimalNumberFormat = dfl.DecimalFormat[0].Pattern[0].Data()
+						break
+					}
+				}
+			}
+
 			// var decimalFormat, currencyFormat, currencyAccountingFormat, percentageFormat string
 
 			// if len(ldml.Numbers.DecimalFormats) > 0 && len(ldml.Numbers.DecimalFormats[0].DecimalFormatLength) > 0 {
@@ -365,122 +401,26 @@ func preProcess(cldr *cldr.CLDR) {
 	}
 }
 
-// func parseNumbers(decimal, group, minus, percent, permille, decimalFormat, currencyFormat, currencyAccountingFormat, percentageFormat string) {
-
-// 	if includeDecimalDigits {
-
-// 		nfMutex.RLock()
-
-// 		if format, exists := numberFormats[pattern]; exists {
-// 			nfMutex.RUnlock()
-// 			return format
-// 		}
-
-// 		nfMutex.RUnlock()
-
-// 	} else {
-
-// 		nfndMutex.RLock()
-
-// 		if format, exists := numberFormatsNoDecimals[pattern]; exists {
-// 			nfndMutex.RUnlock()
-// 			return format
-// 		}
-
-// 		nfndMutex.RUnlock()
-// 	}
-
-// 	format := new(numberFormat)
-// 	patterns := strings.Split(pattern, ";")
-
-// 	matches := prefixSuffixRegex.FindAllStringSubmatch(patterns[0], -1)
-// 	if len(matches) > 0 {
-// 		if len(matches[0]) > 1 {
-// 			format.positivePrefix = matches[0][1]
-// 		}
-// 		if len(matches[0]) > 2 {
-// 			format.positiveSuffix = matches[0][2]
-// 		}
-// 	}
-
-// 	// default values for negative prefix & suffix
-// 	format.negativePrefix = string(n.Symbols.Negative) + string(format.positivePrefix)
-// 	format.negativeSuffix = format.positiveSuffix
-
-// 	// see if they are in the pattern
-// 	if len(patterns) > 1 {
-// 		matches = prefixSuffixRegex.FindAllStringSubmatch(patterns[1], -1)
-
-// 		if len(matches) > 0 {
-// 			if len(matches[0]) > 1 {
-// 				format.negativePrefix = matches[0][1]
-// 			}
-// 			if len(matches[0]) > 2 {
-// 				format.negativeSuffix = matches[0][2]
-// 			}
-// 		}
-// 	}
-
-// 	pat := patterns[0]
+func parseDecimalNumberFormat(trans *translator) (results string) {
 
-// 	if strings.Index(pat, "%") != -1 {
-// 		format.multiplier = 100
-// 	} else if strings.Index(pat, "‰") != -1 {
-// 		format.multiplier = 1000
-// 	} else {
-// 		format.multiplier = 1
-// 	}
-
-// 	pos := strings.Index(pat, ".")
-
-// 	if pos != -1 {
-// 		pos2 := strings.LastIndex(pat, "0")
-// 		if pos2 > pos {
-// 			format.minDecimalDigits = pos2 - pos
-// 		}
-
-// 		pos3 := strings.LastIndex(pat, "#")
-// 		if pos3 >= pos2 {
-// 			format.maxDecimalDigits = pos3 - pos
-// 		} else {
-// 			format.maxDecimalDigits = format.minDecimalDigits
-// 		}
+	if len(trans.DecimalNumberFormat) == 0 {
+		return
+	}
 
-// 		pat = pat[0:pos]
-// 	}
+	trans.FmtNumberExists = true
 
-// 	p := strings.Replace(pat, ",", "", -1)
-// 	pos = strings.Index(p, "0")
-// 	if pos != -1 {
-// 		format.minIntegerDigits = strings.LastIndex(p, "0") - pos + 1
-// 	}
-
-// 	p = strings.Replace(pat, "#", "0", -1)
-// 	pos = strings.LastIndex(pat, ",")
-// 	if pos != -1 {
-// 		format.groupSizeFinal = strings.LastIndex(p, "0") - pos
-// 		pos2 := strings.LastIndex(p[0:pos], ",")
-// 		if pos2 != -1 {
-// 			format.groupSizeMain = pos - pos2 - 1
-// 		} else {
-// 			format.groupSizeMain = format.groupSizeFinal
-// 		}
-// 	}
+	match := groupLenRegex.FindString(trans.DecimalNumberFormat)
+	if len(match) > 0 {
+		trans.FmtNumberGroupLen = len(match) - 2
+	}
 
-// 	if includeDecimalDigits {
-// 		nfMutex.Lock()
-// 		numberFormats[pattern] = format
-// 		nfMutex.Unlock()
-// 		return format
-// 	}
+	match = requiredDecimalRegex.FindString(trans.DecimalNumberFormat)
+	if len(match) > 0 {
+		trans.FmtNumberMinDecimalLen = len(match) - 1
+	}
 
-// 	format.maxDecimalDigits = 0
-// 	format.minDecimalDigits = 0
-// 	nfndMutex.Lock()
-// 	numberFormatsNoDecimals[pattern] = format
-// 	nfndMutex.Unlock()
-// 	return format
-// }
+	return
+}
 
 type sortRank struct {
 	Rank  uint8

+ 74 - 0
cmd/translator.tmpl

@@ -64,4 +64,78 @@ func({{ .BaseLocale }} *{{ .Locale }}) RangePluralRule(num1 float64, v1 uint64,n
 	{{ .RangeFunc }}
 }
 
+// FmtNumber returns 'num' with digits/precision of 'v' for '{{ .Locale }}' and handles both Whole and Real numbers based on 'v'
+// returned as a []byte just in case the caller wishes to add more and can help
+// avoid allocations; otherwise just cast as string.
+func({{ .BaseLocale }} *{{ .Locale }}) FmtNumber(num float64, v uint64) []byte {
+
+	s := strconv.FormatFloat(num, 'f', int(v), 64)
+	{{ if eq .FmtNumberExists true }}
+	{{ if gt .FmtNumberGroupLen 0 }}
+	l := len(s) + len({{ .BaseLocale }}.decimal) + len({{ .BaseLocale }}.group) * len(s[:len(s)-int(v)-1]) / {{ .FmtNumberGroupLen }}
+	count := 0
+	inWhole := v == 0
+	{{ else }}
+	l := len(s) + len({{ .BaseLocale }}.decimal)
+	{{ end }}
+	b := make([]byte, 0, l)
+
+	for i := len(s) - 1; i >= 0; i-- {
+
+		if s[i] == '.' {
+
+			for j := len({{ .BaseLocale }}.decimal) - 1; j >= 0; j-- {
+				b = append(b, {{ .BaseLocale }}.decimal[j])
+			}
+
+			{{ if gt .FmtNumberGroupLen 0 }}
+			inWhole = true
+			{{ end }}
+			continue
+		}
+
+		{{ if gt .FmtNumberGroupLen 0 }}
+		if inWhole {
+
+			if count == {{ .FmtNumberGroupLen }} {
+
+				for j := len({{ .BaseLocale }}.group) - 1; j >= 0; j-- {
+					b = append(b, {{ .BaseLocale }}.group[j])
+				}
+
+				count = 1
+			} else {
+				count++
+			}
+		}
+
+		{{ end }}
+
+		b = append(b, s[i])
+	}
+
+	// reverse
+	for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
+		b[i], b[j] = b[j], b[i]
+	}
+
+	{{ if gt .FmtNumberMinDecimalLen 0 }}
+	if int(v) < {{ .FmtNumberMinDecimalLen }} {
+
+		if v == 0 {
+			b = append(b, {{ .BaseLocale }}.decimal...)
+		}
+
+		for i := 0; i < {{ .FmtNumberMinDecimalLen }}-int(v); i++ {
+			b = append(b, '0')
+		}
+	}
+	{{ end }}
+
+	return b
+	{{ else }}
+	return []byte(s)
+	{{ end }}
+}
+
 {{ end }}

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
cs/cs.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
cs_CZ/cs_CZ.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
cu/cu.go


Fichier diff supprimé car celui-ci est trop grand
+ 5 - 1
cu_RU/cu_RU.go


+ 54 - 0
cy/cy.go

@@ -2,6 +2,7 @@ package cy
 
 import (
 	"math"
+	"strconv"
 
 	"github.com/go-playground/locales"
 )
@@ -137,3 +138,56 @@ func (cy *cy) RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64)
 	return locales.PluralRuleOther
 
 }
+
+// FmtNumber returns 'num' with digits/precision of 'v' for 'cy' and handles both Whole and Real numbers based on 'v'
+// returned as a []byte just in case the caller wishes to add more and can help
+// avoid allocations; otherwise just cast as string.
+func (cy *cy) FmtNumber(num float64, v uint64) []byte {
+
+	s := strconv.FormatFloat(num, 'f', int(v), 64)
+
+	l := len(s) + len(cy.decimal) + len(cy.group)*len(s[:len(s)-int(v)-1])/3
+
+	count := 0
+	inWhole := v == 0
+
+	b := make([]byte, 0, l)
+
+	for i := len(s) - 1; i >= 0; i-- {
+
+		if s[i] == '.' {
+
+			for j := len(cy.decimal) - 1; j >= 0; j-- {
+				b = append(b, cy.decimal[j])
+			}
+
+			inWhole = true
+
+			continue
+		}
+
+		if inWhole {
+
+			if count == 3 {
+
+				for j := len(cy.group) - 1; j >= 0; j-- {
+					b = append(b, cy.group[j])
+				}
+
+				count = 1
+			} else {
+				count++
+			}
+		}
+
+		b = append(b, s[i])
+	}
+
+	// reverse
+	for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 {
+		b[i], b[j] = b[j], b[i]
+	}
+
+	return b
+
+}

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
cy_GB/cy_GB.go


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
da/da.go


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff