diff options
Diffstat (limited to 'xmloff/source/style')
-rw-r--r-- | xmloff/source/style/xmlnumfe.cxx | 16 | ||||
-rw-r--r-- | xmloff/source/style/xmlnumfi.cxx | 19 |
2 files changed, 27 insertions, 8 deletions
diff --git a/xmloff/source/style/xmlnumfe.cxx b/xmloff/source/style/xmlnumfe.cxx index 7f8a33e7fce5..3070831b1e40 100644 --- a/xmloff/source/style/xmlnumfe.cxx +++ b/xmloff/source/style/xmlnumfe.cxx @@ -1178,6 +1178,7 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt bool bCurrFound = false; bool bInInteger = true; bool bExpSign = true; + bool bDecAlign = false; // decimal alignment with "?" sal_Int32 nExpDigits = 0; sal_Int32 nIntegerSymbols = 0; // for embedded-text, including "#" sal_Int32 nTrailingThousands = 0; // thousands-separators after all digits @@ -1206,9 +1207,17 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt } else if ( !bInInteger && pElemStr ) { - for ( sal_Int32 i = pElemStr->getLength()-1; i >= 0 && (*pElemStr)[i] == '#'; i-- ) + for ( sal_Int32 i = pElemStr->getLength()-1; i >= 0 ; i-- ) { - nMinDecimals --; + sal_Unicode aChar = (*pElemStr)[i]; + if ( aChar == '#' || aChar == '?' ) + { + nMinDecimals --; + if ( aChar == '?' ) + bDecAlign = true; + } + else + break; } } if ( bInInteger && pElemStr ) @@ -1428,6 +1437,9 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt OUStringBuffer sDashStr; if (bDecDashes && nPrecision > 0) comphelper::string::padToLength(sDashStr, nPrecision, '-'); + // "?" in decimal part are replaced by space character + if (bDecAlign && nPrecision > 0) + sDashStr = " "; WriteNumberElement_Impl(nDecimals, nMinDecimals, nInteger, sDashStr.makeStringAndClear(), bThousand, nTrailingThousands, aEmbeddedEntries); diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx index b4a79ea63cb4..8200fd0dcbfb 100644 --- a/xmloff/source/style/xmlnumfi.cxx +++ b/xmloff/source/style/xmlnumfi.cxx @@ -102,6 +102,7 @@ struct SvXMLNumberInfo bool bGrouping; bool bDecReplace; bool bExpSign; + bool bDecAlign; double fDisplayFactor; std::map<sal_Int32, OUString> m_EmbeddedElements; @@ -109,7 +110,7 @@ struct SvXMLNumberInfo { nDecimals = nInteger = nExpDigits = nExpInterval = nNumerDigits = nDenomDigits = nFracDenominator = nMinDecimalDigits = -1; - bGrouping = bDecReplace = false; + bGrouping = bDecReplace = bDecAlign = false; bExpSign = true; fDisplayFactor = 1.0; } @@ -940,10 +941,16 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport, aNumInfo.fDisplayFactor = fAttrDouble; break; case XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT: - if ( !sValue.isEmpty() ) - aNumInfo.bDecReplace = true; // only a default string is supported + if ( sValue == " " ) + { + aNumInfo.bDecAlign = true; // space replacement for "?" + bVarDecimals = true; + } else - bVarDecimals = true; // empty replacement string: variable decimals + if ( sValue.isEmpty() ) + bVarDecimals = true; // empty replacement string: variable decimals + else // all other strings + aNumInfo.bDecReplace = true; // decimal replacement with dashes break; case XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS: if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 )) @@ -1876,8 +1883,8 @@ void SvXMLNumFormatContext::AddNumber( const SvXMLNumberInfo& rInfo ) if ( ( rInfo.bDecReplace || rInfo.nMinDecimalDigits < rInfo.nDecimals ) && nPrec ) // add decimal replacement (dashes) { - // add dashes for explicit decimal replacement, # for variable decimals - sal_Unicode cAdd = rInfo.bDecReplace ? '-' : '#'; + // add dashes for explicit decimal replacement, # or ? for variable decimals + sal_Unicode cAdd = rInfo.bDecReplace ? '-' : ( rInfo.bDecAlign ? '?': '#' ); if ( rInfo.nMinDecimalDigits == 0 ) aFormatCode.append( pData->GetLocaleData( nFormatLang ).getNumDecimalSep() ); |