summaryrefslogtreecommitdiff
path: root/svl/inc/svl/zformat.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'svl/inc/svl/zformat.hxx')
-rw-r--r--svl/inc/svl/zformat.hxx589
1 files changed, 589 insertions, 0 deletions
diff --git a/svl/inc/svl/zformat.hxx b/svl/inc/svl/zformat.hxx
new file mode 100644
index 000000000000..991460015e6d
--- /dev/null
+++ b/svl/inc/svl/zformat.hxx
@@ -0,0 +1,589 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: zformat.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _ZFORMAT_HXX
+#define _ZFORMAT_HXX
+
+#include "svl/svldllapi.h"
+#include <tools/string.hxx>
+#include <i18npool/mslangid.hxx>
+#include <svl/zforlist.hxx>
+#include <svl/nfversi.hxx>
+#include <svl/nfkeytab.hxx>
+
+// We need ImpSvNumberformatScan for the private SvNumberformat definitions.
+#ifdef _ZFORMAT_CXX
+#include "zforscan.hxx"
+#endif
+
+// If comment field is also in format code string, was used for SUPD versions 371-372
+#define NF_COMMENT_IN_FORMATSTRING 0
+
+namespace utl {
+ class DigitGroupingIterator;
+}
+
+class SvStream;
+class Color;
+
+class ImpSvNumberformatScan; // format code string scanner
+class ImpSvNumberInputScan; // input string scanner
+class ImpSvNumMultipleWriteHeader; // compatible file format
+class ImpSvNumMultipleReadHeader; // compatible file format
+class SvNumberFormatter;
+
+enum SvNumberformatLimitOps
+{
+ NUMBERFORMAT_OP_NO = 0, // Undefined, no OP
+ NUMBERFORMAT_OP_EQ = 1, // Operator =
+ NUMBERFORMAT_OP_NE = 2, // Operator <>
+ NUMBERFORMAT_OP_LT = 3, // Operator <
+ NUMBERFORMAT_OP_LE = 4, // Operator <=
+ NUMBERFORMAT_OP_GT = 5, // Operator >
+ NUMBERFORMAT_OP_GE = 6 // Operator >=
+};
+
+// SYSTEM-german to SYSTEM-xxx and vice versa conversion hack onLoad
+enum NfHackConversion
+{
+ NF_CONVERT_NONE,
+ NF_CONVERT_GERMAN_ENGLISH,
+ NF_CONVERT_ENGLISH_GERMAN
+};
+
+struct ImpSvNumberformatInfo // Struct for FormatInfo
+{
+ String* sStrArray; // Array of symbols
+ short* nTypeArray; // Array of infos
+ USHORT nThousand; // Count of group separator sequences
+ USHORT nCntPre; // Count of digits before decimal point
+ USHORT nCntPost; // Count of digits after decimal point
+ USHORT nCntExp; // Count of exponent digits, or AM/PM
+ short eScannedType; // Type determined by scan
+ BOOL bThousand; // Has group (AKA thousand) separator
+
+ void Copy( const ImpSvNumberformatInfo& rNumFor, USHORT nAnz );
+ void Load(SvStream& rStream, USHORT nAnz);
+ void Save(SvStream& rStream, USHORT nAnz) const;
+};
+
+// NativeNumber, represent numbers using CJK or other digits if nNum>0,
+// eLang specifies the Locale to use.
+class SvNumberNatNum
+{
+ LanguageType eLang;
+ BYTE nNum;
+ BOOL bDBNum :1; // DBNum, to be converted to NatNum
+ BOOL bDate :1; // Used in date? (needed for DBNum/NatNum mapping)
+ BOOL bSet :1; // If set, since NatNum0 is possible
+
+public:
+
+ static BYTE MapDBNumToNatNum( BYTE nDBNum, LanguageType eLang, BOOL bDate );
+ static BYTE MapNatNumToDBNum( BYTE nNatNum, LanguageType eLang, BOOL bDate );
+
+ SvNumberNatNum() : eLang( LANGUAGE_DONTKNOW ), nNum(0),
+ bDBNum(0), bDate(0), bSet(0) {}
+ BOOL IsComplete() const { return bSet && eLang != LANGUAGE_DONTKNOW; }
+ BYTE GetRawNum() const { return nNum; }
+ BYTE GetNatNum() const { return bDBNum ? MapDBNumToNatNum( nNum, eLang, bDate ) : nNum; }
+ BYTE GetDBNum() const { return bDBNum ? nNum : MapNatNumToDBNum( nNum, eLang, bDate ); }
+ LanguageType GetLang() const { return eLang; }
+ void SetLang( LanguageType e ) { eLang = e; }
+ void SetNum( BYTE nNumber, BOOL bDBNumber )
+ {
+ nNum = nNumber;
+ bDBNum = bDBNumber;
+ bSet = TRUE;
+ }
+ BOOL IsSet() const { return bSet; }
+ void SetDate( BOOL bDateP ) { bDate = (bDateP != 0); }
+};
+
+class CharClass;
+
+class ImpSvNumFor // One of four subformats of the format code string
+{
+public:
+ ImpSvNumFor(); // Ctor without filling the Info
+ ~ImpSvNumFor();
+
+ void Enlarge(USHORT nAnz); // Init of arrays to the right size
+ void Load( SvStream& rStream, ImpSvNumberformatScan& rSc,
+ String& rLoadedColorName);
+ void Save( SvStream& rStream ) const;
+
+ // if pSc is set, it is used to get the Color pointer
+ void Copy( const ImpSvNumFor& rNumFor, ImpSvNumberformatScan* pSc );
+
+ // Access to Info; call Enlarge before!
+ ImpSvNumberformatInfo& Info() { return aI;}
+ const ImpSvNumberformatInfo& Info() const { return aI; }
+
+ // Get count of substrings (symbols)
+ USHORT GetnAnz() const { return nAnzStrings;}
+
+ Color* GetColor() const { return pColor; }
+ void SetColor( Color* pCol, String& rName )
+ { pColor = pCol; sColorName = rName; }
+ const String& GetColorName() const { return sColorName; }
+
+ // new SYMBOLTYPE_CURRENCY in subformat?
+ BOOL HasNewCurrency() const;
+ BOOL GetNewCurrencySymbol( String& rSymbol, String& rExtension ) const;
+ void SaveNewCurrencyMap( SvStream& rStream ) const;
+ void LoadNewCurrencyMap( SvStream& rStream );
+
+ // [NatNum1], [NatNum2], ...
+ void SetNatNumNum( BYTE nNum, BOOL bDBNum ) { aNatNum.SetNum( nNum, bDBNum ); }
+ void SetNatNumLang( LanguageType eLang ) { aNatNum.SetLang( eLang ); }
+ void SetNatNumDate( BOOL bDate ) { aNatNum.SetDate( bDate ); }
+ const SvNumberNatNum& GetNatNum() const { return aNatNum; }
+
+private:
+ ImpSvNumberformatInfo aI; // Hilfsstruct fuer die restlichen Infos
+ String sColorName; // color name
+ Color* pColor; // pointer to color of subformat
+ USHORT nAnzStrings; // count of symbols
+ SvNumberNatNum aNatNum; // DoubleByteNumber
+
+};
+
+class SVL_DLLPUBLIC SvNumberformat
+{
+public:
+ // Ctor for Load
+ SvNumberformat( ImpSvNumberformatScan& rSc, LanguageType eLge );
+
+ // Normal ctor
+ SvNumberformat( String& rString,
+ ImpSvNumberformatScan* pSc,
+ ImpSvNumberInputScan* pISc,
+ xub_StrLen& nCheckPos,
+ LanguageType& eLan,
+ BOOL bStand = FALSE );
+
+ // Copy ctor
+ SvNumberformat( SvNumberformat& rFormat );
+
+ // Copy ctor with exchange of format code string scanner (used in merge)
+ SvNumberformat( SvNumberformat& rFormat, ImpSvNumberformatScan& rSc );
+
+ ~SvNumberformat();
+
+ /// Get type of format, may include NUMBERFORMAT_DEFINED bit
+ short GetType() const
+ { return (nNewStandardDefined &&
+ (nNewStandardDefined <= SV_NUMBERFORMATTER_VERSION)) ?
+ (eType & ~NUMBERFORMAT_DEFINED) : eType; }
+
+ void SetType(const short eSetType) { eType = eSetType; }
+ // Standard means the I18N defined standard format of this type
+ void SetStandard() { bStandard = TRUE; }
+ BOOL IsStandard() const { return bStandard; }
+
+ // For versions before version nVer it is UserDefined, for newer versions
+ // it is builtin. nVer of SV_NUMBERFORMATTER_VERSION_...
+ void SetNewStandardDefined( USHORT nVer )
+ { nNewStandardDefined = nVer; eType |= NUMBERFORMAT_DEFINED; }
+
+ USHORT GetNewStandardDefined() const { return nNewStandardDefined; }
+ BOOL IsAdditionalStandardDefined() const
+ { return nNewStandardDefined == SV_NUMBERFORMATTER_VERSION_ADDITIONAL_I18N_FORMATS; }
+
+ LanguageType GetLanguage() const { return eLnge;}
+
+ const String& GetFormatstring() const { return sFormatstring; }
+
+ // Build a format string of application defined keywords
+ String GetMappedFormatstring( const NfKeywordTable& rKeywords,
+ const LocaleDataWrapper& rLoc,
+ BOOL bDontQuote = FALSE ) const;
+
+ void SetUsed(const BOOL b) { bIsUsed = b; }
+ BOOL GetUsed() const { return bIsUsed; }
+ BOOL IsStarFormatSupported() const { return bStarFlag; }
+ void SetStarFormatSupport( BOOL b ) { bStarFlag = b; }
+
+ NfHackConversion Load( SvStream& rStream, ImpSvNumMultipleReadHeader& rHdr,
+ SvNumberFormatter* pConverter, ImpSvNumberInputScan& rISc );
+ void Save( SvStream& rStream, ImpSvNumMultipleWriteHeader& rHdr ) const;
+
+ // Load a string which might contain an Euro symbol,
+ // in fact that could be any string used in number formats.
+ static void LoadString( SvStream& rStream, String& rStr );
+
+ BOOL GetOutputString( double fNumber, String& OutString, Color** ppColor );
+ BOOL GetOutputString( String& sString, String& OutString, Color** ppColor );
+
+ // True if type text
+ BOOL IsTextFormat() const { return (eType & NUMBERFORMAT_TEXT) != 0; }
+ // True if 4th subformat present
+ BOOL HasTextFormat() const
+ {
+ return (NumFor[3].GetnAnz() > 0) ||
+ (NumFor[3].Info().eScannedType == NUMBERFORMAT_TEXT);
+ }
+
+ void GetFormatSpecialInfo(BOOL& bThousand,
+ BOOL& IsRed,
+ USHORT& nPrecision,
+ USHORT& nAnzLeading) const;
+
+ /// Count of decimal precision
+ USHORT GetFormatPrecision() const { return NumFor[0].Info().nCntPost; }
+
+ //! Read/write access on a special USHORT component, may only be used on the
+ //! standard format 0, 5000, ... and only by the number formatter!
+ USHORT GetLastInsertKey() const
+ { return NumFor[0].Info().nThousand; }
+ void SetLastInsertKey(USHORT nKey)
+ { NumFor[0].Info().nThousand = nKey; }
+
+ //! Only onLoad: convert from stored to current system language/country
+ void ConvertLanguage( SvNumberFormatter& rConverter,
+ LanguageType eConvertFrom, LanguageType eConvertTo, BOOL bSystem = FALSE );
+
+ // Substring of a subformat code nNumFor (0..3)
+ // nPos == 0xFFFF => last substring
+ // bString==TRUE: first/last SYMBOLTYPE_STRING or SYMBOLTYPE_CURRENCY
+ const String* GetNumForString( USHORT nNumFor, USHORT nPos,
+ BOOL bString = FALSE ) const;
+
+ // Subtype of a subformat code nNumFor (0..3)
+ // nPos == 0xFFFF => last substring
+ // bString==TRUE: first/last SYMBOLTYPE_STRING or SYMBOLTYPE_CURRENCY
+ short GetNumForType( USHORT nNumFor, USHORT nPos, BOOL bString = FALSE ) const;
+
+ /** If the count of string elements (substrings, ignoring [modifiers] and
+ so on) in a subformat code nNumFor (0..3) is equal to the given number.
+ Used by ImpSvNumberInputScan::IsNumberFormatMain() to detect a matched
+ format. */
+ BOOL IsNumForStringElementCountEqual( USHORT nNumFor, USHORT nAllCount,
+ USHORT nNumCount ) const
+ {
+ if ( nNumFor < 4 )
+ {
+ // First try a simple approach. Note that this is called only
+ // if all MidStrings did match so far, to verify that all
+ // strings of the format were matched and not just the starting
+ // sequence, so we don't have to check if GetnAnz() includes
+ // [modifiers] or anything else if both counts are equal.
+ USHORT nCnt = NumFor[nNumFor].GetnAnz();
+ if ( nAllCount == nCnt )
+ return TRUE;
+ if ( nAllCount < nCnt ) // check ignoring [modifiers] and so on
+ return ImpGetNumForStringElementCount( nNumFor ) ==
+ (nAllCount - nNumCount);
+ }
+ return FALSE;
+ }
+
+ // Whether the second subformat code is really for negative numbers
+ // or another limit set.
+ BOOL IsNegativeRealNegative() const
+ {
+ return fLimit1 == 0.0 && fLimit2 == 0.0 &&
+ ( (eOp1 == NUMBERFORMAT_OP_GE && eOp2 == NUMBERFORMAT_OP_NO) ||
+ (eOp1 == NUMBERFORMAT_OP_GT && eOp2 == NUMBERFORMAT_OP_LT) ||
+ (eOp1 == NUMBERFORMAT_OP_NO && eOp2 == NUMBERFORMAT_OP_NO) );
+ }
+
+ // Whether the negative format is without a sign or not
+ BOOL IsNegativeWithoutSign() const;
+
+ // Whether a new SYMBOLTYPE_CURRENCY is contained in the format
+ BOOL HasNewCurrency() const;
+
+ // Build string from NewCurrency for saving it SO50 compatible
+ void Build50Formatstring( String& rStr ) const;
+
+ // strip [$-yyy] from all [$xxx-yyy] leaving only xxx's,
+ // if bQuoteSymbol==TRUE the xxx will become "xxx"
+ static String StripNewCurrencyDelimiters( const String& rStr,
+ BOOL bQuoteSymbol );
+
+ // If a new SYMBOLTYPE_CURRENCY is contained if the format is of type
+ // NUMBERFORMAT_CURRENCY, and if so the symbol xxx and the extension nnn
+ // of [$xxx-nnn] are returned
+ BOOL GetNewCurrencySymbol( String& rSymbol, String& rExtension ) const;
+
+ static BOOL HasStringNegativeSign( const String& rStr );
+
+ /**
+ Whether a character at position nPos is somewhere between two matching
+ cQuote or not.
+ If nPos points to a cQuote, a TRUE is returned on an opening cQuote,
+ a FALSE is returned on a closing cQuote.
+ A cQuote between quotes may be escaped by a cEscIn, a cQuote outside of
+ quotes may be escaped by a cEscOut.
+ The default '\0' results in no escapement possible.
+ Defaults are set right according to the "unlogic" of the Numberformatter
+ */
+ static BOOL IsInQuote( const String& rString, xub_StrLen nPos,
+ sal_Unicode cQuote = '"',
+ sal_Unicode cEscIn = '\0', sal_Unicode cEscOut = '\\' );
+
+ /**
+ Return the position of a matching closing cQuote if the character at
+ position nPos is between two matching cQuote, otherwise return
+ STRING_NOTFOUND.
+ If nPos points to an opening cQuote the position of the matching
+ closing cQuote is returned.
+ If nPos points to a closing cQuote nPos is returned.
+ If nPos points into a part which starts with an opening cQuote but has
+ no closing cQuote, rString.Len() is returned.
+ Uses <method>IsInQuote</method> internally, so you don't have to call
+ that prior to a call of this method.
+ */
+ static xub_StrLen GetQuoteEnd( const String& rString, xub_StrLen nPos,
+ sal_Unicode cQuote = '"',
+ sal_Unicode cEscIn = '\0', sal_Unicode cEscOut = '\\' );
+
+ void SetComment( const String& rStr )
+#if NF_COMMENT_IN_FORMATSTRING
+ { SetComment( rStr, sFormatstring, sComment ); }
+#else
+ { sComment = rStr; }
+#endif
+ const String& GetComment() const { return sComment; }
+
+ // Erase "{ "..." }" from format subcode string to get the pure comment (old version)
+ static void EraseCommentBraces( String& rStr );
+ // Set comment rStr in format string rFormat and in rComment (old version)
+ static void SetComment( const String& rStr, String& rFormat, String& rComment );
+ // Erase comment at end of rStr to get pure format code string (old version)
+ static void EraseComment( String& rStr );
+
+ /** Insert the number of blanks into the string that is needed to simulate
+ the width of character c for underscore formats */
+ static xub_StrLen InsertBlanks( String& r, xub_StrLen nPos, sal_Unicode c );
+
+ /// One of YMD,DMY,MDY if date format
+ DateFormat GetDateOrder() const;
+
+ /** A coded value of the exact YMD combination used, if date format.
+ For example: YYYY-MM-DD => ('Y' << 16) | ('M' << 8) | 'D'
+ or: MM/YY => ('M' << 8) | 'Y' */
+ sal_uInt32 GetExactDateOrder() const;
+
+ ImpSvNumberformatScan& ImpGetScan() const { return rScan; }
+
+ // used in XML export
+ void GetConditions( SvNumberformatLimitOps& rOper1, double& rVal1,
+ SvNumberformatLimitOps& rOper2, double& rVal2 ) const;
+ Color* GetColor( USHORT nNumFor ) const;
+ void GetNumForInfo( USHORT nNumFor, short& rScannedType,
+ BOOL& bThousand, USHORT& nPrecision, USHORT& nAnzLeading ) const;
+
+ // rAttr.Number not empty if NatNum attributes are to be stored
+ void GetNatNumXml(
+ ::com::sun::star::i18n::NativeNumberXmlAttributes& rAttr,
+ USHORT nNumFor ) const;
+
+ /** @returns <TRUE/> if E,EE,R,RR,AAA,AAAA in format code of subformat
+ nNumFor (0..3) and <b>no</b> preceding calendar was specified and the
+ currently loaded calendar is "gregorian". */
+ BOOL IsOtherCalendar( USHORT nNumFor ) const
+ {
+ if ( nNumFor < 4 )
+ return ImpIsOtherCalendar( NumFor[nNumFor] );
+ return FALSE;
+ }
+
+ /** Switches to the first non-"gregorian" calendar, but only if the current
+ calendar is "gregorian"; original calendar name and date/time returned,
+ but only if calendar switched and rOrgCalendar was empty. */
+ void SwitchToOtherCalendar( String& rOrgCalendar, double& fOrgDateTime ) const;
+
+ /** Switches to the "gregorian" calendar, but only if the current calendar
+ is non-"gregorian" and rOrgCalendar is not empty. Thus a preceding
+ ImpSwitchToOtherCalendar() call should have been placed prior to
+ calling this method. */
+ void SwitchToGregorianCalendar( const String& rOrgCalendar, double fOrgDateTime ) const;
+
+ /** Switches to the first specified calendar, if any, in subformat nNumFor
+ (0..3). Original calendar name and date/time returned, but only if
+ calendar switched and rOrgCalendar was empty.
+
+ @return
+ <TRUE/> if a calendar was specified and switched to,
+ <FALSE/> else.
+ */
+ BOOL SwitchToSpecifiedCalendar( String& rOrgCalendar, double& fOrgDateTime,
+ USHORT nNumFor ) const
+ {
+ if ( nNumFor < 4 )
+ return ImpSwitchToSpecifiedCalendar( rOrgCalendar,
+ fOrgDateTime, NumFor[nNumFor] );
+ return FALSE;
+ }
+
+private:
+ ImpSvNumFor NumFor[4]; // Array for the 4 subformats
+ String sFormatstring; // The format code string
+ String sComment; // Comment, since number formatter version 6
+ double fLimit1; // Value for first condition
+ double fLimit2; // Value for second condition
+ ImpSvNumberformatScan& rScan; // Format code scanner
+ LanguageType eLnge; // Language/country of the format
+ SvNumberformatLimitOps eOp1; // Operator for first condition
+ SvNumberformatLimitOps eOp2; // Operator for second condition
+ USHORT nNewStandardDefined; // new builtin formats as of version 6
+ short eType; // Type of format
+ BOOL bStarFlag; // Take *n format as ESC n
+ BOOL bStandard; // If this is a default standard format
+ BOOL bIsUsed; // Flag as used for storing
+
+ SVL_DLLPRIVATE USHORT ImpGetNumForStringElementCount( USHORT nNumFor ) const;
+
+ SVL_DLLPRIVATE BOOL ImpIsOtherCalendar( const ImpSvNumFor& rNumFor ) const;
+
+ SVL_DLLPRIVATE BOOL ImpSwitchToSpecifiedCalendar( String& rOrgCalendar,
+ double& fOrgDateTime, const ImpSvNumFor& rNumFor ) const;
+
+#ifdef _ZFORMAT_CXX // ----- private implementation methods -----
+
+ const CharClass& rChrCls() const { return rScan.GetChrCls(); }
+ const LocaleDataWrapper& rLoc() const { return rScan.GetLoc(); }
+ CalendarWrapper& GetCal() const { return rScan.GetCal(); }
+ const SvNumberFormatter& GetFormatter() const { return *rScan.GetNumberformatter(); }
+
+ // divide in substrings and color conditions
+ SVL_DLLPRIVATE short ImpNextSymbol( String& rString,
+ xub_StrLen& nPos,
+ String& sSymbol );
+
+ // read string until ']' and strip blanks (after condition)
+ SVL_DLLPRIVATE static xub_StrLen ImpGetNumber( String& rString,
+ xub_StrLen& nPos,
+ String& sSymbol );
+
+ // get xxx of "[$-xxx]" as LanguageType, starting at and advancing position nPos
+ SVL_DLLPRIVATE static LanguageType ImpGetLanguageType( const String& rString, xub_StrLen& nPos );
+
+ // standard number output
+ SVL_DLLPRIVATE void ImpGetOutputStandard( double& fNumber, String& OutString );
+ // numbers in input line
+ SVL_DLLPRIVATE void ImpGetOutputInputLine( double fNumber, String& OutString );
+
+ // check subcondition
+ // OP undefined => -1
+ // else 0 or 1
+ SVL_DLLPRIVATE short ImpCheckCondition(double& fNumber,
+ double& fLimit,
+ SvNumberformatLimitOps eOp);
+
+ SVL_DLLPRIVATE ULONG ImpGGT(ULONG x, ULONG y);
+ SVL_DLLPRIVATE ULONG ImpGGTRound(ULONG x, ULONG y);
+
+ // Helper function for number strings
+ // append string symbols, insert leading 0 or ' ', or ...
+ SVL_DLLPRIVATE BOOL ImpNumberFill( String& sStr,
+ double& rNumber,
+ xub_StrLen& k,
+ USHORT& j,
+ USHORT nIx,
+ short eSymbolType );
+
+ // Helper function to fill in the integer part and the group (AKA thousand) separators
+ SVL_DLLPRIVATE BOOL ImpNumberFillWithThousands( String& sStr,
+ double& rNumber,
+ xub_StrLen k,
+ USHORT j,
+ USHORT nIx,
+ USHORT nDigCnt );
+ // Hilfsfunktion zum Auffuellen der Vor-
+ // kommazahl auch mit Tausenderpunkt
+
+ // Helper function to fill in the group (AKA thousand) separators
+ // or to skip additional digits
+ SVL_DLLPRIVATE void ImpDigitFill( String& sStr,
+ xub_StrLen nStart,
+ xub_StrLen& k,
+ USHORT nIx,
+ xub_StrLen & nDigitCount,
+ utl::DigitGroupingIterator & );
+
+ SVL_DLLPRIVATE BOOL ImpGetDateOutput( double fNumber,
+ USHORT nIx,
+ String& OutString );
+ SVL_DLLPRIVATE BOOL ImpGetTimeOutput( double fNumber,
+ USHORT nIx,
+ String& OutString );
+ SVL_DLLPRIVATE BOOL ImpGetDateTimeOutput( double fNumber,
+ USHORT nIx,
+ String& OutString );
+
+ // Switches to the "gregorian" calendar if the current calendar is
+ // non-"gregorian" and the era is a "Dummy" era of a calendar which doesn't
+ // know a "before" era (like zh_TW ROC or ja_JP Gengou). If switched and
+ // rOrgCalendar was "gregorian" the string is emptied. If rOrgCalendar was
+ // empty the previous calendar name and date/time are returned.
+ SVL_DLLPRIVATE BOOL ImpFallBackToGregorianCalendar( String& rOrgCalendar, double& fOrgDateTime );
+
+ // Append a "G" short era string of the given calendar. In the case of a
+ // Gengou calendar this is a one character abbreviation, for other
+ // calendars the XExtendedCalendar::getDisplayString() method is called.
+ SVL_DLLPRIVATE static void ImpAppendEraG( String& OutString, const CalendarWrapper& rCal,
+ sal_Int16 nNatNum );
+
+ SVL_DLLPRIVATE BOOL ImpGetNumberOutput( double fNumber,
+ USHORT nIx,
+ String& OutString );
+
+ SVL_DLLPRIVATE void ImpCopyNumberformat( const SvNumberformat& rFormat );
+
+ // normal digits or other digits, depending on ImpSvNumFor.aNatNum,
+ // [NatNum1], [NatNum2], ...
+ SVL_DLLPRIVATE String ImpGetNatNumString( const SvNumberNatNum& rNum, sal_Int32 nVal,
+ USHORT nMinDigits = 0 ) const;
+
+ String ImpIntToString( USHORT nIx, sal_Int32 nVal, USHORT nMinDigits = 0 ) const
+ {
+ const SvNumberNatNum& rNum = NumFor[nIx].GetNatNum();
+ if ( nMinDigits || rNum.IsComplete() )
+ return ImpGetNatNumString( rNum, nVal, nMinDigits );
+ return String::CreateFromInt32( nVal );
+ }
+
+ // transliterate according to NativeNumber
+ SVL_DLLPRIVATE void ImpTransliterateImpl( String& rStr, const SvNumberNatNum& rNum ) const;
+
+ void ImpTransliterate( String& rStr, const SvNumberNatNum& rNum ) const
+ {
+ if ( rNum.IsComplete() )
+ ImpTransliterateImpl( rStr, rNum );
+ }
+
+#endif // _ZFORMAT_CXX
+
+};
+
+#endif // _ZFORMAT_HXX