1// Copyright (C) 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4*******************************************************************************
5* Copyright (C) 1997-2015, International Business Machines Corporation and    *
6* others. All Rights Reserved.                                                *
7*******************************************************************************
8*/
9#ifndef _DECIMAL_FORMAT_PATTERN
10#define _DECIMAL_FORMAT_PATTERN
11
12#include "unicode/utypes.h"
13
14#if !UCONFIG_NO_FORMATTING
15
16#include "unicode/uobject.h"
17#include "unicode/unistr.h"
18#include "digitlst.h"
19#include "affixpatternparser.h"
20
21U_NAMESPACE_BEGIN
22
23// currency sign count
24enum CurrencySignCount {
25    fgCurrencySignCountZero,
26    fgCurrencySignCountInSymbolFormat,
27    fgCurrencySignCountInISOFormat,
28    fgCurrencySignCountInPluralFormat
29};
30
31class DecimalFormatSymbols;
32
33struct DecimalFormatPattern : public UMemory {
34  enum EPadPosition {
35      kPadBeforePrefix,
36      kPadAfterPrefix,
37      kPadBeforeSuffix,
38      kPadAfterSuffix
39  };
40
41  DecimalFormatPattern();
42
43  int32_t fMinimumIntegerDigits;
44  int32_t fMaximumIntegerDigits;
45  int32_t fMinimumFractionDigits;
46  int32_t fMaximumFractionDigits;
47  UBool fUseSignificantDigits;
48  int32_t fMinimumSignificantDigits;
49  int32_t fMaximumSignificantDigits;
50  UBool fUseExponentialNotation;
51  int32_t fMinExponentDigits;
52  UBool fExponentSignAlwaysShown;
53  int32_t fCurrencySignCount;
54  UBool fGroupingUsed;
55  int32_t fGroupingSize;
56  int32_t fGroupingSize2;
57  int32_t fMultiplier;
58  UBool fDecimalSeparatorAlwaysShown;
59  int32_t fFormatWidth;
60  UBool fRoundingIncrementUsed;
61  DigitList fRoundingIncrement;
62  UChar32 fPad;
63  UBool fNegPatternsBogus;
64  UBool fPosPatternsBogus;
65  UnicodeString fNegPrefixPattern;
66  UnicodeString fNegSuffixPattern;
67  UnicodeString fPosPrefixPattern;
68  UnicodeString fPosSuffixPattern;
69  AffixPattern fNegPrefixAffix;
70  AffixPattern fNegSuffixAffix;
71  AffixPattern fPosPrefixAffix;
72  AffixPattern fPosSuffixAffix;
73  EPadPosition fPadPosition;
74};
75
76class DecimalFormatPatternParser : public UMemory {
77  public:
78    DecimalFormatPatternParser();
79    void useSymbols(const DecimalFormatSymbols& symbols);
80
81    void applyPatternWithoutExpandAffix(
82        const UnicodeString& pattern,
83        DecimalFormatPattern& out,
84        UParseError& parseError,
85        UErrorCode& status);
86  private:
87    DecimalFormatPatternParser(const DecimalFormatPatternParser&);
88    DecimalFormatPatternParser& operator=(DecimalFormatPatternParser& rhs);
89    UChar32 fZeroDigit;
90    UChar32 fSigDigit;
91    UnicodeString fGroupingSeparator;
92    UnicodeString fDecimalSeparator;
93    UnicodeString fPercent;
94    UnicodeString fPerMill;
95    UnicodeString fDigit;
96    UnicodeString fSeparator;
97    UnicodeString fExponent;
98    UnicodeString fPlus;
99    UnicodeString fMinus;
100    UnicodeString fPadEscape;
101};
102
103U_NAMESPACE_END
104
105#endif /* !UCONFIG_NO_FORMATTING */
106#endif
107