1package ca 2 3import ( 4 "math" 5 "strconv" 6 "time" 7 8 "github.com/go-playground/locales" 9 "github.com/go-playground/locales/currency" 10) 11 12type ca struct { 13 locale string 14 pluralsCardinal []locales.PluralRule 15 pluralsOrdinal []locales.PluralRule 16 pluralsRange []locales.PluralRule 17 decimal string 18 group string 19 minus string 20 percent string 21 perMille string 22 timeSeparator string 23 inifinity string 24 currencies []string // idx = enum of currency code 25 currencyPositiveSuffix string 26 currencyNegativePrefix string 27 currencyNegativeSuffix string 28 monthsAbbreviated []string 29 monthsNarrow []string 30 monthsWide []string 31 daysAbbreviated []string 32 daysNarrow []string 33 daysShort []string 34 daysWide []string 35 periodsAbbreviated []string 36 periodsNarrow []string 37 periodsShort []string 38 periodsWide []string 39 erasAbbreviated []string 40 erasNarrow []string 41 erasWide []string 42 timezones map[string]string 43} 44 45// New returns a new instance of translator for the 'ca' locale 46func New() locales.Translator { 47 return &ca{ 48 locale: "ca", 49 pluralsCardinal: []locales.PluralRule{2, 6}, 50 pluralsOrdinal: []locales.PluralRule{2, 3, 4, 6}, 51 pluralsRange: []locales.PluralRule{6}, 52 decimal: ",", 53 group: ".", 54 minus: "-", 55 percent: "%", 56 perMille: "‰", 57 timeSeparator: ":", 58 inifinity: "∞", 59 currencies: []string{"ADP", "AED", "AFA", "AFN", "ALK", "ALL", "AMD", "ANG", "AOA", "AOK", "AON", "AOR", "ARA", "ARL", "ARM", "ARP", "ARS", "ATS", "AU$", "AWG", "AZM", "AZN", "BAD", "BAM", "BAN", "BBD", "BDT", "BEC", "BEF", "BEL", "BGL", "BGM", "BGN", "BGO", "BHD", "BIF", "BMD", "BND", "BOB", "BOL", "BOP", "BOV", "BRB", "BRC", "BRE", "BRL", "BRN", "BRR", "BRZ", "BSD", "BTN", "BUK", "BWP", "BYB", "BYN", "BYR", "BZD", "CAD", "CDF", "CHE", "CHF", "CHW", "CLE", "CLF", "CLP", "CNH", "CNX", "¥", "COP", "COU", "CRC", "CSD", "CSK", "CUC", "CUP", "CVE", "CYP", "CZK", "DDM", "DEM", "DJF", "DKK", "DOP", "DZD", "ECS", "ECV", "EEK", "EGP", "ERN", "ESA", "ESB", "₧", "ETB", "€", "FIM", "FJD", "FKP", "FRF", "£", "GEK", "GEL", "GHC", "GHS", "GIP", "GMD", "GNF", "GNS", "GQE", "GRD", "GTQ", "GWE", "GWP", "GYD", "HK$", "HNL", "HRD", "HRK", "HTG", "HUF", "IDR", "IEP", "ILP", "ILR", "₪", "₹", "IQD", "IRR", "ISJ", "ISK", "ITL", "JMD", "JOD", "JP¥", "KES", "KGS", "KHR", "KMF", "KPW", "KRH", "KRO", "₩", "KWD", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "LSL", "LTL", "LTT", "LUC", "LUF", "LUL", "LVL", "LVR", "LYD", "MAD", "MAF", "MCF", "MDC", "MDL", "MGA", "MGF", "MKD", "MKN", "MLF", "MMK", "MNT", "MOP", "MRO", "MTL", "MTP", "MUR", "MVP", "MVR", "MWK", "MXN", "MXP", "MXV", "MYR", "MZE", "MZM", "MZN", "NAD", "NGN", "NIC", "NIO", "NLG", "NOK", "NPR", "NZ$", "OMR", "PAB", "PEI", "PEN", "PES", "PGK", "PHP", "PKR", "PLN", "PLZ", "PTE", "PYG", "QAR", "RHD", "ROL", "RON", "RSD", "RUB", "RUR", "RWF", "SAR", "SBD", "SCR", "SDD", "SDG", "SDP", "SEK", "SGD", "SHP", "SIT", "SKK", "SLL", "SOS", "SRD", "SRG", "SSP", "STD", "STN", "SUR", "SVC", "SYP", "SZL", "฿", "TJR", "TJS", "TMM", "TMT", "TND", "TOP", "TPE", "TRL", "TRY", "TTD", "NT$", "TZS", "UAH", "UAK", "UGS", "UGX", "USD", "USN", "USS", "UYI", "UYP", "UYU", "UZS", "VEB", "VEF", "₫", "VNN", "VUV", "WST", "FCFA", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XEU", "XFO", "XFU", "CFA", "XPD", "CFPF", "XPT", "XRE", "XSU", "XTS", "XUA", "XXX", "YDD", "YER", "YUD", "YUM", "YUN", "YUR", "ZAL", "ZAR", "ZMK", "ZMW", "ZRN", "ZRZ", "ZWD", "ZWL", "ZWR"}, 60 currencyPositiveSuffix: " ", 61 currencyNegativePrefix: "(", 62 currencyNegativeSuffix: " )", 63 monthsAbbreviated: []string{"", "de gen.", "de febr.", "de març", "d’abr.", "de maig", "de juny", "de jul.", "d’ag.", "de set.", "d’oct.", "de nov.", "de des."}, 64 monthsNarrow: []string{"", "GN", "FB", "MÇ", "AB", "MG", "JN", "JL", "AG", "ST", "OC", "NV", "DS"}, 65 monthsWide: []string{"", "de gener", "de febrer", "de març", "d’abril", "de maig", "de juny", "de juliol", "d’agost", "de setembre", "d’octubre", "de novembre", "de desembre"}, 66 daysAbbreviated: []string{"dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."}, 67 daysNarrow: []string{"dg", "dl", "dt", "dc", "dj", "dv", "ds"}, 68 daysShort: []string{"dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."}, 69 daysWide: []string{"diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"}, 70 periodsAbbreviated: []string{"a. m.", "p. m."}, 71 periodsNarrow: []string{"a. m.", "p. m."}, 72 periodsWide: []string{"a. m.", "p. m."}, 73 erasAbbreviated: []string{"aC", "dC"}, 74 erasNarrow: []string{"aC", "dC"}, 75 erasWide: []string{"abans de Crist", "després de Crist"}, 76 timezones: map[string]string{"LHST": "Hora estàndard de Lord Howe", "ACWST": "Hora estàndard d’Austràlia centre-occidental", "HECU": "Hora d’estiu de Cuba", "HNPM": "Hora estàndard de Saint-Pierre i Miquelon", "HADT": "Hora d’estiu de Hawaii-Aleutianes", "HKST": "Hora d’estiu de Hong Kong", "LHDT": "Horari d’estiu de Lord Howe", "HNPMX": "Hora estàndard del Pacífic de Mèxic", "ADT": "Hora d’estiu de l’Atlàntic", "GMT": "Hora del Meridià de Greenwich", "CHAST": "Hora estàndard de Chatham", "HNT": "Hora estàndard de Terranova", "CAT": "Hora de l’Àfrica Central", "EAT": "Hora de l’Àfrica Oriental", "COST": "Hora d’estiu de Colòmbia", "CHADT": "Hora d’estiu de Chatham", "PST": "Hora estàndard del Pacífic", "MEZ": "Hora estàndard del Centre d’Europa", "WARST": "Hora d’estiu de l’oest de l’Argentina", "AWST": "Hora estàndard d’Austràlia Occidental", "AWDT": "Hora d’estiu d’Austràlia Occidental", "OESZ": "Hora d’estiu de l’Est d’Europa", "PDT": "Hora d’estiu del Pacífic", "HNNOMX": "Hora estàndard del nord-oest de Mèxic", "MST": "Hora estàndard de Macau", "MDT": "Hora d’estiu de Macau", "HAST": "Hora estàndard de Hawaii-Aleutianes", "ART": "Hora estàndard de l’Argentina", "GYT": "Hora de Guyana", "MESZ": "Hora d’estiu del Centre d’Europa", "VET": "Hora de Veneçuela", "HNEG": "Hora estàndard de l’Est de Grenlàndia", "WAST": "Hora d’estiu de l’Àfrica Occidental", "JST": "Hora estàndard del Japó", "HEPMX": "Hora d’estiu del Pacífic de Mèxic", "WIB": "Hora de l’oest d’Indonèsia", "SAST": "Hora estàndard del sud de l’Àfrica", "NZST": "Hora estàndard de Nova Zelanda", "ACWDT": "Hora d’estiu d’Austràlia centre-occidental", "WART": "Hora estàndard de l’oest de l’Argentina", "CLST": "Hora d’estiu de Xile", "WEZ": "Hora estàndard de l’Oest d’Europa", "AKST": "Hora estàndard d’Alaska", "EST": "Hora estàndard oriental d’Amèrica del Nord", "ACST": "Hora estàndard d’Austràlia Central", "WIT": "Hora de l’est d’Indonèsia", "TMST": "Hora d’estiu del Turkmenistan", "ECT": "Hora de l’Equador", "HKT": "Hora estàndard de Hong Kong", "TMT": "Hora estàndard del Turkmenistan", "OEZ": "Hora estàndard de l’Est d’Europa", "CDT": "Hora d’estiu central d’Amèrica del Nord", "WAT": "Hora estàndard de l’Àfrica Occidental", "BOT": "Hora de Bolívia", "JDT": "Hora d’estiu del Japó", "NZDT": "Hora d’estiu de Nova Zelanda", "∅∅∅": "Hora d’estiu de les Açores", "CLT": "Hora estàndard de Xile", "EDT": "Hora d’estiu oriental d’Amèrica del Nord", "ARST": "Hora d’estiu de l’Argentina", "HNCU": "Hora estàndard de Cuba", "MYT": "Hora de Malàisia", "AKDT": "Hora d’estiu d’Alaska", "WITA": "Hora central d’Indonèsia", "HAT": "Hora d’estiu de Terranova", "WESZ": "Hora d’estiu de l’Oest d’Europa", "HEOG": "Hora d’estiu de l’Oest de Grenlàndia", "ACDT": "Hora d’estiu d’Austràlia Central", "IST": "Hora estàndard de l’Índia", "AEDT": "Hora d’estiu d’Austràlia Oriental", "CST": "Hora estàndard central d’Amèrica del Nord", "BT": "Hora de Bhutan", "SGT": "Hora de Singapur", "HEEG": "Hora d’estiu de l’Est de Grenlàndia", "SRT": "Hora de Surinam", "UYST": "Hora d’estiu de l’Uruguai", "AST": "Hora estàndard de l’Atlàntic", "GFT": "Hora de la Guaiana Francesa", "HNOG": "Hora estàndard de l’Oest de Grenlàndia", "HENOMX": "Hora d’estiu del nord-oest de Mèxic", "UYT": "Hora estàndard de l’Uruguai", "ChST": "Hora de Chamorro", "AEST": "Hora estàndard d’Austràlia Oriental", "HEPM": "Hora d’estiu de Saint-Pierre i Miquelon", "COT": "Hora estàndard de Colòmbia"}, 77 } 78} 79 80// Locale returns the current translators string locale 81func (ca *ca) Locale() string { 82 return ca.locale 83} 84 85// PluralsCardinal returns the list of cardinal plural rules associated with 'ca' 86func (ca *ca) PluralsCardinal() []locales.PluralRule { 87 return ca.pluralsCardinal 88} 89 90// PluralsOrdinal returns the list of ordinal plural rules associated with 'ca' 91func (ca *ca) PluralsOrdinal() []locales.PluralRule { 92 return ca.pluralsOrdinal 93} 94 95// PluralsRange returns the list of range plural rules associated with 'ca' 96func (ca *ca) PluralsRange() []locales.PluralRule { 97 return ca.pluralsRange 98} 99 100// CardinalPluralRule returns the cardinal PluralRule given 'num' and digits/precision of 'v' for 'ca' 101func (ca *ca) CardinalPluralRule(num float64, v uint64) locales.PluralRule { 102 103 n := math.Abs(num) 104 i := int64(n) 105 106 if i == 1 && v == 0 { 107 return locales.PluralRuleOne 108 } 109 110 return locales.PluralRuleOther 111} 112 113// OrdinalPluralRule returns the ordinal PluralRule given 'num' and digits/precision of 'v' for 'ca' 114func (ca *ca) OrdinalPluralRule(num float64, v uint64) locales.PluralRule { 115 116 n := math.Abs(num) 117 118 if n == 1 || n == 3 { 119 return locales.PluralRuleOne 120 } else if n == 2 { 121 return locales.PluralRuleTwo 122 } else if n == 4 { 123 return locales.PluralRuleFew 124 } 125 126 return locales.PluralRuleOther 127} 128 129// RangePluralRule returns the ordinal PluralRule given 'num1', 'num2' and digits/precision of 'v1' and 'v2' for 'ca' 130func (ca *ca) RangePluralRule(num1 float64, v1 uint64, num2 float64, v2 uint64) locales.PluralRule { 131 return locales.PluralRuleOther 132} 133 134// MonthAbbreviated returns the locales abbreviated month given the 'month' provided 135func (ca *ca) MonthAbbreviated(month time.Month) string { 136 return ca.monthsAbbreviated[month] 137} 138 139// MonthsAbbreviated returns the locales abbreviated months 140func (ca *ca) MonthsAbbreviated() []string { 141 return ca.monthsAbbreviated[1:] 142} 143 144// MonthNarrow returns the locales narrow month given the 'month' provided 145func (ca *ca) MonthNarrow(month time.Month) string { 146 return ca.monthsNarrow[month] 147} 148 149// MonthsNarrow returns the locales narrow months 150func (ca *ca) MonthsNarrow() []string { 151 return ca.monthsNarrow[1:] 152} 153 154// MonthWide returns the locales wide month given the 'month' provided 155func (ca *ca) MonthWide(month time.Month) string { 156 return ca.monthsWide[month] 157} 158 159// MonthsWide returns the locales wide months 160func (ca *ca) MonthsWide() []string { 161 return ca.monthsWide[1:] 162} 163 164// WeekdayAbbreviated returns the locales abbreviated weekday given the 'weekday' provided 165func (ca *ca) WeekdayAbbreviated(weekday time.Weekday) string { 166 return ca.daysAbbreviated[weekday] 167} 168 169// WeekdaysAbbreviated returns the locales abbreviated weekdays 170func (ca *ca) WeekdaysAbbreviated() []string { 171 return ca.daysAbbreviated 172} 173 174// WeekdayNarrow returns the locales narrow weekday given the 'weekday' provided 175func (ca *ca) WeekdayNarrow(weekday time.Weekday) string { 176 return ca.daysNarrow[weekday] 177} 178 179// WeekdaysNarrow returns the locales narrow weekdays 180func (ca *ca) WeekdaysNarrow() []string { 181 return ca.daysNarrow 182} 183 184// WeekdayShort returns the locales short weekday given the 'weekday' provided 185func (ca *ca) WeekdayShort(weekday time.Weekday) string { 186 return ca.daysShort[weekday] 187} 188 189// WeekdaysShort returns the locales short weekdays 190func (ca *ca) WeekdaysShort() []string { 191 return ca.daysShort 192} 193 194// WeekdayWide returns the locales wide weekday given the 'weekday' provided 195func (ca *ca) WeekdayWide(weekday time.Weekday) string { 196 return ca.daysWide[weekday] 197} 198 199// WeekdaysWide returns the locales wide weekdays 200func (ca *ca) WeekdaysWide() []string { 201 return ca.daysWide 202} 203 204// Decimal returns the decimal point of number 205func (ca *ca) Decimal() string { 206 return ca.decimal 207} 208 209// Group returns the group of number 210func (ca *ca) Group() string { 211 return ca.group 212} 213 214// Group returns the minus sign of number 215func (ca *ca) Minus() string { 216 return ca.minus 217} 218 219// FmtNumber returns 'num' with digits/precision of 'v' for 'ca' and handles both Whole and Real numbers based on 'v' 220func (ca *ca) FmtNumber(num float64, v uint64) string { 221 222 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64) 223 l := len(s) + 2 + 1*len(s[:len(s)-int(v)-1])/3 224 count := 0 225 inWhole := v == 0 226 b := make([]byte, 0, l) 227 228 for i := len(s) - 1; i >= 0; i-- { 229 230 if s[i] == '.' { 231 b = append(b, ca.decimal[0]) 232 inWhole = true 233 continue 234 } 235 236 if inWhole { 237 if count == 3 { 238 b = append(b, ca.group[0]) 239 count = 1 240 } else { 241 count++ 242 } 243 } 244 245 b = append(b, s[i]) 246 } 247 248 if num < 0 { 249 b = append(b, ca.minus[0]) 250 } 251 252 // reverse 253 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { 254 b[i], b[j] = b[j], b[i] 255 } 256 257 return string(b) 258} 259 260// FmtPercent returns 'num' with digits/precision of 'v' for 'ca' and handles both Whole and Real numbers based on 'v' 261// NOTE: 'num' passed into FmtPercent is assumed to be in percent already 262func (ca *ca) FmtPercent(num float64, v uint64) string { 263 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64) 264 l := len(s) + 3 265 b := make([]byte, 0, l) 266 267 for i := len(s) - 1; i >= 0; i-- { 268 269 if s[i] == '.' { 270 b = append(b, ca.decimal[0]) 271 continue 272 } 273 274 b = append(b, s[i]) 275 } 276 277 if num < 0 { 278 b = append(b, ca.minus[0]) 279 } 280 281 // reverse 282 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { 283 b[i], b[j] = b[j], b[i] 284 } 285 286 b = append(b, ca.percent...) 287 288 return string(b) 289} 290 291// FmtCurrency returns the currency representation of 'num' with digits/precision of 'v' for 'ca' 292func (ca *ca) FmtCurrency(num float64, v uint64, currency currency.Type) string { 293 294 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64) 295 symbol := ca.currencies[currency] 296 l := len(s) + len(symbol) + 4 + 1*len(s[:len(s)-int(v)-1])/3 297 count := 0 298 inWhole := v == 0 299 b := make([]byte, 0, l) 300 301 for i := len(s) - 1; i >= 0; i-- { 302 303 if s[i] == '.' { 304 b = append(b, ca.decimal[0]) 305 inWhole = true 306 continue 307 } 308 309 if inWhole { 310 if count == 3 { 311 b = append(b, ca.group[0]) 312 count = 1 313 } else { 314 count++ 315 } 316 } 317 318 b = append(b, s[i]) 319 } 320 321 if num < 0 { 322 b = append(b, ca.minus[0]) 323 } 324 325 // reverse 326 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { 327 b[i], b[j] = b[j], b[i] 328 } 329 330 if int(v) < 2 { 331 332 if v == 0 { 333 b = append(b, ca.decimal...) 334 } 335 336 for i := 0; i < 2-int(v); i++ { 337 b = append(b, '0') 338 } 339 } 340 341 b = append(b, ca.currencyPositiveSuffix...) 342 343 b = append(b, symbol...) 344 345 return string(b) 346} 347 348// FmtAccounting returns the currency representation of 'num' with digits/precision of 'v' for 'ca' 349// in accounting notation. 350func (ca *ca) FmtAccounting(num float64, v uint64, currency currency.Type) string { 351 352 s := strconv.FormatFloat(math.Abs(num), 'f', int(v), 64) 353 symbol := ca.currencies[currency] 354 l := len(s) + len(symbol) + 6 + 1*len(s[:len(s)-int(v)-1])/3 355 count := 0 356 inWhole := v == 0 357 b := make([]byte, 0, l) 358 359 for i := len(s) - 1; i >= 0; i-- { 360 361 if s[i] == '.' { 362 b = append(b, ca.decimal[0]) 363 inWhole = true 364 continue 365 } 366 367 if inWhole { 368 if count == 3 { 369 b = append(b, ca.group[0]) 370 count = 1 371 } else { 372 count++ 373 } 374 } 375 376 b = append(b, s[i]) 377 } 378 379 if num < 0 { 380 381 b = append(b, ca.currencyNegativePrefix[0]) 382 383 } 384 385 // reverse 386 for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { 387 b[i], b[j] = b[j], b[i] 388 } 389 390 if int(v) < 2 { 391 392 if v == 0 { 393 b = append(b, ca.decimal...) 394 } 395 396 for i := 0; i < 2-int(v); i++ { 397 b = append(b, '0') 398 } 399 } 400 401 if num < 0 { 402 b = append(b, ca.currencyNegativeSuffix...) 403 b = append(b, symbol...) 404 } else { 405 406 b = append(b, ca.currencyPositiveSuffix...) 407 b = append(b, symbol...) 408 } 409 410 return string(b) 411} 412 413// FmtDateShort returns the short date representation of 't' for 'ca' 414func (ca *ca) FmtDateShort(t time.Time) string { 415 416 b := make([]byte, 0, 32) 417 418 b = strconv.AppendInt(b, int64(t.Day()), 10) 419 b = append(b, []byte{0x2f}...) 420 b = strconv.AppendInt(b, int64(t.Month()), 10) 421 b = append(b, []byte{0x2f}...) 422 423 if t.Year() > 9 { 424 b = append(b, strconv.Itoa(t.Year())[2:]...) 425 } else { 426 b = append(b, strconv.Itoa(t.Year())[1:]...) 427 } 428 429 return string(b) 430} 431 432// FmtDateMedium returns the medium date representation of 't' for 'ca' 433func (ca *ca) FmtDateMedium(t time.Time) string { 434 435 b := make([]byte, 0, 32) 436 437 b = strconv.AppendInt(b, int64(t.Day()), 10) 438 b = append(b, []byte{0x20}...) 439 b = append(b, ca.monthsAbbreviated[t.Month()]...) 440 b = append(b, []byte{0x20}...) 441 442 if t.Year() > 0 { 443 b = strconv.AppendInt(b, int64(t.Year()), 10) 444 } else { 445 b = strconv.AppendInt(b, int64(-t.Year()), 10) 446 } 447 448 return string(b) 449} 450 451// FmtDateLong returns the long date representation of 't' for 'ca' 452func (ca *ca) FmtDateLong(t time.Time) string { 453 454 b := make([]byte, 0, 32) 455 456 b = strconv.AppendInt(b, int64(t.Day()), 10) 457 b = append(b, []byte{0x20}...) 458 b = append(b, ca.monthsWide[t.Month()]...) 459 b = append(b, []byte{0x20, 0x64, 0x65}...) 460 b = append(b, []byte{0x20}...) 461 462 if t.Year() > 0 { 463 b = strconv.AppendInt(b, int64(t.Year()), 10) 464 } else { 465 b = strconv.AppendInt(b, int64(-t.Year()), 10) 466 } 467 468 return string(b) 469} 470 471// FmtDateFull returns the full date representation of 't' for 'ca' 472func (ca *ca) FmtDateFull(t time.Time) string { 473 474 b := make([]byte, 0, 32) 475 476 b = append(b, ca.daysWide[t.Weekday()]...) 477 b = append(b, []byte{0x2c, 0x20}...) 478 b = strconv.AppendInt(b, int64(t.Day()), 10) 479 b = append(b, []byte{0x20}...) 480 b = append(b, ca.monthsWide[t.Month()]...) 481 b = append(b, []byte{0x20, 0x64, 0x65}...) 482 b = append(b, []byte{0x20}...) 483 484 if t.Year() > 0 { 485 b = strconv.AppendInt(b, int64(t.Year()), 10) 486 } else { 487 b = strconv.AppendInt(b, int64(-t.Year()), 10) 488 } 489 490 return string(b) 491} 492 493// FmtTimeShort returns the short time representation of 't' for 'ca' 494func (ca *ca) FmtTimeShort(t time.Time) string { 495 496 b := make([]byte, 0, 32) 497 498 b = strconv.AppendInt(b, int64(t.Hour()), 10) 499 b = append(b, ca.timeSeparator...) 500 501 if t.Minute() < 10 { 502 b = append(b, '0') 503 } 504 505 b = strconv.AppendInt(b, int64(t.Minute()), 10) 506 507 return string(b) 508} 509 510// FmtTimeMedium returns the medium time representation of 't' for 'ca' 511func (ca *ca) FmtTimeMedium(t time.Time) string { 512 513 b := make([]byte, 0, 32) 514 515 b = strconv.AppendInt(b, int64(t.Hour()), 10) 516 b = append(b, ca.timeSeparator...) 517 518 if t.Minute() < 10 { 519 b = append(b, '0') 520 } 521 522 b = strconv.AppendInt(b, int64(t.Minute()), 10) 523 b = append(b, ca.timeSeparator...) 524 525 if t.Second() < 10 { 526 b = append(b, '0') 527 } 528 529 b = strconv.AppendInt(b, int64(t.Second()), 10) 530 531 return string(b) 532} 533 534// FmtTimeLong returns the long time representation of 't' for 'ca' 535func (ca *ca) FmtTimeLong(t time.Time) string { 536 537 b := make([]byte, 0, 32) 538 539 b = strconv.AppendInt(b, int64(t.Hour()), 10) 540 b = append(b, ca.timeSeparator...) 541 542 if t.Minute() < 10 { 543 b = append(b, '0') 544 } 545 546 b = strconv.AppendInt(b, int64(t.Minute()), 10) 547 b = append(b, ca.timeSeparator...) 548 549 if t.Second() < 10 { 550 b = append(b, '0') 551 } 552 553 b = strconv.AppendInt(b, int64(t.Second()), 10) 554 b = append(b, []byte{0x20}...) 555 556 tz, _ := t.Zone() 557 b = append(b, tz...) 558 559 return string(b) 560} 561 562// FmtTimeFull returns the full time representation of 't' for 'ca' 563func (ca *ca) FmtTimeFull(t time.Time) string { 564 565 b := make([]byte, 0, 32) 566 567 b = strconv.AppendInt(b, int64(t.Hour()), 10) 568 b = append(b, ca.timeSeparator...) 569 570 if t.Minute() < 10 { 571 b = append(b, '0') 572 } 573 574 b = strconv.AppendInt(b, int64(t.Minute()), 10) 575 b = append(b, ca.timeSeparator...) 576 577 if t.Second() < 10 { 578 b = append(b, '0') 579 } 580 581 b = strconv.AppendInt(b, int64(t.Second()), 10) 582 b = append(b, []byte{0x20}...) 583 584 tz, _ := t.Zone() 585 586 if btz, ok := ca.timezones[tz]; ok { 587 b = append(b, btz...) 588 } else { 589 b = append(b, tz...) 590 } 591 592 return string(b) 593} 594