diff options
-rw-r--r-- | include/svl/zforlist.hxx | 3 | ||||
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 55 | ||||
-rw-r--r-- | svl/source/numbers/zforlist.cxx | 74 |
3 files changed, 78 insertions, 54 deletions
diff --git a/include/svl/zforlist.hxx b/include/svl/zforlist.hxx index 70371d59a1bd..664ddbc25de7 100644 --- a/include/svl/zforlist.hxx +++ b/include/svl/zforlist.hxx @@ -616,6 +616,9 @@ public: sal_uInt16& nPrecision, sal_uInt16& nLeadingCnt, LanguageType eLnge = LANGUAGE_DONTKNOW ); + /// Get return string for Calc CELL() function, "G", "D1", ... + OUString GetCalcCellReturn( sal_uInt32 nFormat ) const; + /// Check if format code string may be deleted by user bool IsUserDefined( const OUString& sStr, LanguageType eLnge = LANGUAGE_DONTKNOW ); diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 8f54c25d258b..03a8f46731a6 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -2202,60 +2202,7 @@ namespace { void getFormatString(SvNumberFormatter* pFormatter, sal_uLong nFormat, OUString& rFmtStr) { - bool bAppendPrec = true; - sal_uInt16 nPrec, nLeading; - bool bThousand, bIsRed; - pFormatter->GetFormatSpecialInfo( nFormat, bThousand, bIsRed, nPrec, nLeading ); - - switch( pFormatter->GetType( nFormat ) ) - { - case SvNumFormatType::NUMBER: - if(bThousand) rFmtStr = ","; else rFmtStr = "F"; - break; - case SvNumFormatType::CURRENCY: - rFmtStr = "C"; - break; - case SvNumFormatType::SCIENTIFIC: - rFmtStr = "S"; - break; - case SvNumFormatType::PERCENT: - rFmtStr = "P"; - break; - default: - { - bAppendPrec = false; - switch( pFormatter->GetIndexTableOffset( nFormat ) ) - { - case NF_DATE_SYSTEM_SHORT: - case NF_DATE_SYS_DMMMYY: - case NF_DATE_SYS_DDMMYY: - case NF_DATE_SYS_DDMMYYYY: - case NF_DATE_SYS_DMMMYYYY: - case NF_DATE_DIN_DMMMYYYY: - case NF_DATE_SYS_DMMMMYYYY: - case NF_DATE_DIN_DMMMMYYYY: rFmtStr = "D1"; break; - case NF_DATE_SYS_DDMMM: rFmtStr = "D2"; break; - case NF_DATE_SYS_MMYY: rFmtStr = "D3"; break; - case NF_DATETIME_SYSTEM_SHORT_HHMM: - case NF_DATETIME_SYS_DDMMYYYY_HHMM: - case NF_DATETIME_SYS_DDMMYYYY_HHMMSS: - rFmtStr = "D4"; break; - case NF_DATE_DIN_MMDD: rFmtStr = "D5"; break; - case NF_TIME_HHMMSSAMPM: rFmtStr = "D6"; break; - case NF_TIME_HHMMAMPM: rFmtStr = "D7"; break; - case NF_TIME_HHMMSS: rFmtStr = "D8"; break; - case NF_TIME_HHMM: rFmtStr = "D9"; break; - default: rFmtStr = "G"; - } - } - } - if( bAppendPrec ) - rFmtStr += OUString::number(nPrec); - const SvNumberformat* pFormat = pFormatter->GetEntry( nFormat ); - if( lcl_FormatHasNegColor( pFormat ) ) - rFmtStr += "-"; - if( lcl_FormatHasOpenPar( pFormat ) ) - rFmtStr += "()"; + rFmtStr = pFormatter->GetCalcCellReturn( nFormat); } } diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx index 21886b25d04e..4edf0692a41e 100644 --- a/svl/source/numbers/zforlist.cxx +++ b/svl/source/numbers/zforlist.cxx @@ -2179,6 +2179,80 @@ sal_uInt32 SvNumberFormatter::GetFormatSpecialInfo( const OUString& rFormatStrin return nCheckPos; } +OUString SvNumberFormatter::GetCalcCellReturn( sal_uInt32 nFormat ) const +{ + ::osl::MutexGuard aGuard( GetInstanceMutex() ); + const SvNumberformat* pFormat = GetFormatEntry( nFormat ); + if (!pFormat) + return "G"; + + OUString aStr; + bool bAppendPrec = true; + sal_uInt16 nPrec, nLeading; + bool bThousand, bIsRed; + pFormat->GetFormatSpecialInfo( bThousand, bIsRed, nPrec, nLeading ); + + switch (pFormat->GetMaskedType()) + { + case SvNumFormatType::NUMBER: + if (bThousand) + aStr = ","; + else + aStr = "F"; + break; + case SvNumFormatType::CURRENCY: + aStr = "C"; + break; + case SvNumFormatType::SCIENTIFIC: + aStr = "S"; + break; + case SvNumFormatType::PERCENT: + aStr = "P"; + break; + default: + { + bAppendPrec = false; + switch (GetIndexTableOffset( nFormat )) + { + case NF_DATE_SYSTEM_SHORT: + case NF_DATE_SYS_DMMMYY: + case NF_DATE_SYS_DDMMYY: + case NF_DATE_SYS_DDMMYYYY: + case NF_DATE_SYS_DMMMYYYY: + case NF_DATE_DIN_DMMMYYYY: + case NF_DATE_SYS_DMMMMYYYY: + case NF_DATE_DIN_DMMMMYYYY: aStr = "D1"; break; + case NF_DATE_SYS_DDMMM: aStr = "D2"; break; + case NF_DATE_SYS_MMYY: aStr = "D3"; break; + case NF_DATETIME_SYSTEM_SHORT_HHMM: + case NF_DATETIME_SYS_DDMMYYYY_HHMM: + case NF_DATETIME_SYS_DDMMYYYY_HHMMSS: + aStr = "D4"; break; + case NF_DATE_DIN_MMDD: aStr = "D5"; break; + case NF_TIME_HHMMSSAMPM: aStr = "D6"; break; + case NF_TIME_HHMMAMPM: aStr = "D7"; break; + case NF_TIME_HHMMSS: aStr = "D8"; break; + case NF_TIME_HHMM: aStr = "D9"; break; + default: aStr = "G"; + } + } + } + + if (bAppendPrec) + aStr += OUString::number(nPrec); + + if (pFormat->GetColor( 1 )) + aStr += "-"; // negative color + + /* FIXME: this probably should not match on literal strings and only be + * performed on number or currency formats, but it is what Calc originally + * implemented. */ + if (pFormat->GetFormatstring().indexOf('(') != -1) + aStr += "()"; + + return aStr; +} + sal_Int32 SvNumberFormatter::ImpGetFormatCodeIndex( css::uno::Sequence< css::i18n::NumberFormatCode >& rSeq, const NfIndexTableOffset nTabOff ) |