diff options
author | Laurent Balland-Poirier <laurent.balland-poirier@laposte.net> | 2015-12-30 23:32:15 +0100 |
---|---|---|
committer | jan iversen <jani@documentfoundation.org> | 2016-01-11 13:21:43 +0000 |
commit | 3ee66e306cf0ca9c2b56de26c28e8130d7b72f64 (patch) | |
tree | 2874d829b407bf120061462fc8362ed797bc415e | |
parent | 3ba1b60c97b342c13593d37ccf2b97a919808dfc (diff) |
tdf#40517 Export/Import in ODF decimal replacement with space
Number format such as "0.???" is saved in ODF with number:decimal-replacement=" "
Change-Id: I0dd19b5ea126f380bcf17a3ccc5d8c355119e23b
Reviewed-on: https://gerrit.libreoffice.org/21021
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: jan iversen <jani@documentfoundation.org>
-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() ); |