|
|
#ifndef CITN_H
#define CITN_H
#include "sphelper.h"
// Flags for number display
typedef enum DISPLAYFLAGS { DF_UNFORMATTED = (1L << 0),// No formatting
DF_ORDINAL = (1L << 1),// Ordinal number
DF_WHOLENUMBER = (1L << 2),// Should be displayed without decimal
DF_FIXEDWIDTH = (1L << 3),// Requiring a certain width
DF_LEADINGZERO = (1L << 4),// Presence of leading 0 of the number is between 0 and 1
DF_NOTHOUSANDSGROUP = (1L << 5),// Do not do any thousands grouping (commas)
DF_MILLIONBILLION = (1L << 6) // If the number is a flat "millions" or "billions"
// then display as "3 million"
} DISPLAYFLAGS;
class CSimpleITN { public:
CSimpleITN(LANGID langid) { m_langid = langid; m_pwszNeg = NULL; } ~CSimpleITN() { if (m_pwszNeg) delete m_pwszNeg;
if ( m_nmfmtDefault.lpDecimalSep ) delete[] m_nmfmtDefault.lpDecimalSep;
if ( m_nmfmtDefault.lpThousandSep ) delete[] m_nmfmtDefault.lpThousandSep; }
HRESULT _EnsureNumberFormatDefaults(void); HRESULT MakeNumberNegative( WCHAR *pwszNumber, UINT cSize ); HRESULT MakeDisplayNumber( DOUBLE dblNum, DWORD dwDisplayFlags, UINT uiFixedWidth, UINT uiDecimalPlaces, WCHAR *pwszNum, UINT cSize );
HRESULT InterpretNumberSimple(const SPPHRASEPROPERTY *pProperties, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize) { HRESULT hr = _EnsureNumberFormatDefaults();
if (S_OK != hr) return hr;
hr = E_NOTIMPL; switch(PRIMARYLANGID(m_langid)) { case LANG_ENGLISH: hr = InterpretNumberEn(pProperties, TRUE, pdblVal, pszVal, cSize, TRUE); break; case LANG_JAPANESE: hr = InterpretNumberJp(pProperties, TRUE, pdblVal, pszVal, cSize, TRUE); break; case LANG_CHINESE: hr = InterpretNumberCh(pProperties, TRUE, pdblVal, pszVal, cSize, TRUE); break; default: break; } return hr; }
HRESULT InterpretNumberEn(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt);
HRESULT InterpretIntegerEn(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt, BOOL fNegative);
HRESULT InterpretDecimalEn(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt, BOOL fNegative);
ULONG ComputeNum999En(const SPPHRASEPROPERTY *pProperties );
HRESULT InterpretNumberJp(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt);
HRESULT InterpretIntegerJp(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt, BOOL fNegative); HRESULT InterpretDecimalJp(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt, BOOL fNegative);
ULONG ComputeNum9999Jp(const SPPHRASEPROPERTY *pProperties );
HRESULT InterpretNumberCh(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt);
HRESULT InterpretIntegerCh(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt, BOOL fNegative);
HRESULT InterpretDecimalCh(const SPPHRASEPROPERTY *pProperties, const bool fCardinal, DOUBLE *pdblVal, WCHAR *pszVal, UINT cSize, const bool fFinalDisplayFmt, BOOL fNegative);
ULONG ComputeNum9999Ch(const SPPHRASEPROPERTY *pProperties); ULONG ComputeNum10000Ch(const SPPHRASEPROPERTY *pProperties);
private: WCHAR *m_pwszNeg; LANGID m_langid; NUMBERFMTW m_nmfmtDefault; };
#define BILLIONS 1
#define MILLIONS 2
#define THOUSANDS 3
#define HUNDREDS 4
#define TENS 5
#define ONES 6
#define TEENS 200
#define NEGATIVE 7
#define MILLBILL 8
#define DIGIT 9
#define TWODIGIT 10
#define FP_PART 11
#define ZERO 12
#define POINT_ZERO 13
#define NUMERATOR 14
#define DENOMINATOR 15
#define WHOLE 16
#define ONEDIGIT 17
#define GRID_INTEGER_99 101
#define GRID_INTEGER_999 102
#define GRID_INTEGER_MILLBILL 103
#define GRID_INTEGER_STANDALONE 104
#define GRID_INTEGER 105
#define GRID_INTEGER_NONNEG 106
#define GRID_DIGIT_NUMBER 107
#define GRID_FP_NUMBER 108
#define GRID_FP_NUMBER_NONNEG 109
// Definition for Chinese Grammar.
#define CHS_HUNDREDMILLIONS 1
#define CHS_TENTHOUSANDS 2
#define CHS_TENTHOUSANDS_ 3
#define CHS_THOUSANDS 4
#define CHS_HUNDREDS 5
#define CHS_HUNDREDS_ 6
#define CHS_ONES 7
#define CHS_INTEGER 8
#define CHS_DECIMAL 9
#define CHS_NEGATIVE 10
#define CHS_PERIOD 23
#define CHS_DIGITS 24
#define CHS_POS_OF_MINUS 27
#define CHS_ONES_THOUSANDS 28
#define CHS_GRID_NUMBER 1001
#define CHS_GRID_NUMBER_MINUS 1002
#define CHS_GRID_DECIMAL 1003
#define CHS_GRID_NUMBER_ALL 1004
// Definition for Japanese Grammar
#define JPN_YENs 1
#define JPN_CHOOs 2
#define JPN_OKUs 3
#define JPN_MANNs 4
#define JPN_SENNs 5
#define JPN_HYAKUs 6
#define JPN_JUUs 7
#define JPN_ICHIs 8
#define JPN_NEGATIVE 9
#define JPN_DIGIT 10
#define JPN_FP_PART 12
#define JPN_FP_PART_D 95
#define JPN_ZERO 13
#define JPN_NUMERATOR 14
#define JPN_DENOMINATOR 15
#define JPN_WHOLE 16
#define JPN_GRID_INTEGER_9999 1001
#define JPN_GRID_INTEGER_STANDALONE 1002
#define JPN_GRID_INTEGER 1003
#define JPN_GRID_INTEGER_NONNEG 1004
#define JPN_GRID_DIGIT_NUMBER 1005
#define JPN_GRID_FP_NUMBER 1006
#define JPN_GRID_NUMBER_ALL 1007
#endif // CITN_H
|