Kaydet (Commit) fdf8e5aa authored tarafından Laurent Balland-Poirier's avatar Laurent Balland-Poirier Kaydeden (comit) Eike Rathke

tdf#30716 start Engineering notation: implement exponent-interval

ODF1.3 implement a new attribute for engineering notation
https://issues.oasis-open.org/browse/OFFICE-1828
This commit only add this attribute to ODF import/export.
Engineering notation is not yet available.

Treat also thousand separator with exponent-interval
Change XML_NAMESPACE_NUMBER to XML_NAMESPACE_LO_EXT for
exponent-interval

Change-Id: Ia18f9e150ca32aa9bbe133c082c3f9330e949f11
Reviewed-on: https://gerrit.libreoffice.org/14875Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
Tested-by: 's avatarEike Rathke <erack@redhat.com>
üst 4cb902ed
...@@ -67,7 +67,7 @@ private: ...@@ -67,7 +67,7 @@ private:
bool bGrouping, sal_Int32 nTrailingThousands, bool bGrouping, sal_Int32 nTrailingThousands,
const SvXMLEmbeddedTextEntryArr& rEmbeddedEntries ); const SvXMLEmbeddedTextEntryArr& rEmbeddedEntries );
SAL_DLLPRIVATE void WriteScientificElement_Impl( sal_Int32 nDecimals, sal_Int32 nInteger, SAL_DLLPRIVATE void WriteScientificElement_Impl( sal_Int32 nDecimals, sal_Int32 nInteger,
bool bGrouping, sal_Int32 nExp ); bool bGrouping, sal_Int32 nExp, sal_Int32 nExpInterval );
SAL_DLLPRIVATE void WriteFractionElement_Impl( sal_Int32 nInteger, bool bGrouping, SAL_DLLPRIVATE void WriteFractionElement_Impl( sal_Int32 nInteger, bool bGrouping,
sal_Int32 nNumeratorDigits, sal_Int32 nDenominatorDigits, sal_Int32 nDenominator ); sal_Int32 nNumeratorDigits, sal_Int32 nDenominatorDigits, sal_Int32 nDenominator );
SAL_DLLPRIVATE void WriteCurrencyElement_Impl( const OUString& rString, SAL_DLLPRIVATE void WriteCurrencyElement_Impl( const OUString& rString,
......
...@@ -3244,6 +3244,8 @@ namespace xmloff { namespace token { ...@@ -3244,6 +3244,8 @@ namespace xmloff { namespace token {
XML_CHART_DUNITS_BUILTINUNIT, XML_CHART_DUNITS_BUILTINUNIT,
XML_EXTERNALDATA, XML_EXTERNALDATA,
XML_EXPONENT_INTERVAL,
XML_TOKEN_END XML_TOKEN_END
}; };
......
...@@ -3242,6 +3242,8 @@ namespace xmloff { namespace token { ...@@ -3242,6 +3242,8 @@ namespace xmloff { namespace token {
TOKEN( "display-units-built-in-unit", XML_CHART_DUNITS_BUILTINUNIT ), TOKEN( "display-units-built-in-unit", XML_CHART_DUNITS_BUILTINUNIT ),
TOKEN( "external-data", XML_EXTERNALDATA), TOKEN( "external-data", XML_EXTERNALDATA),
TOKEN( "exponent-interval", XML_EXPONENT_INTERVAL ),
#if OSL_DEBUG_LEVEL > 0 #if OSL_DEBUG_LEVEL > 0
{ 0, NULL, NULL, XML_TOKEN_END } { 0, NULL, NULL, XML_TOKEN_END }
#else #else
......
...@@ -634,7 +634,7 @@ void SvXMLNumFmtExport::WriteNumberElement_Impl( ...@@ -634,7 +634,7 @@ void SvXMLNumFmtExport::WriteNumberElement_Impl(
void SvXMLNumFmtExport::WriteScientificElement_Impl( void SvXMLNumFmtExport::WriteScientificElement_Impl(
sal_Int32 nDecimals, sal_Int32 nInteger, sal_Int32 nDecimals, sal_Int32 nInteger,
bool bGrouping, sal_Int32 nExp ) bool bGrouping, sal_Int32 nExp, sal_Int32 nExpInterval )
{ {
FinishTextElement_Impl(); FinishTextElement_Impl();
...@@ -665,6 +665,13 @@ void SvXMLNumFmtExport::WriteScientificElement_Impl( ...@@ -665,6 +665,13 @@ void SvXMLNumFmtExport::WriteScientificElement_Impl(
OUString::number( nExp ) ); OUString::number( nExp ) );
} }
// exponent interval for engineering notation
if ( nExpInterval >= 0 )
{ // when exponent-interval will be part of ODF 1.3, change to XML_NAMESPACE_NUMBER
rExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_EXPONENT_INTERVAL,
OUString::number( nExpInterval ) );
}
SvXMLElementExport aElem( rExport, SvXMLElementExport aElem( rExport,
XML_NAMESPACE_NUMBER, XML_SCIENTIFIC_NUMBER, XML_NAMESPACE_NUMBER, XML_SCIENTIFIC_NUMBER,
true, false ); true, false );
...@@ -1400,8 +1407,8 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt ...@@ -1400,8 +1407,8 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt
case css::util::NumberFormat::SCIENTIFIC: case css::util::NumberFormat::SCIENTIFIC:
// #i43959# for scientific numbers, count all integer symbols ("0" and "#") // #i43959# for scientific numbers, count all integer symbols ("0" and "#")
// as integer digits: use nIntegerSymbols instead of nLeading // as integer digits: use nIntegerSymbols instead of nLeading
// (use of '#' to select multiples in exponent might be added later) // nIntegerSymbols represents exponent interval (for engineering notation)
WriteScientificElement_Impl( nPrecision, nIntegerSymbols, bThousand, nExpDigits ); WriteScientificElement_Impl( nPrecision, nLeading, bThousand, nExpDigits, nIntegerSymbols );
bAnyContent = true; bAnyContent = true;
break; break;
case css::util::NumberFormat::FRACTION: case css::util::NumberFormat::FRACTION:
......
...@@ -110,6 +110,7 @@ struct SvXMLNumberInfo ...@@ -110,6 +110,7 @@ struct SvXMLNumberInfo
sal_Int32 nDecimals; sal_Int32 nDecimals;
sal_Int32 nInteger; sal_Int32 nInteger;
sal_Int32 nExpDigits; sal_Int32 nExpDigits;
sal_Int32 nExpInterval;
sal_Int32 nNumerDigits; sal_Int32 nNumerDigits;
sal_Int32 nDenomDigits; sal_Int32 nDenomDigits;
sal_Int32 nFracDenominator; sal_Int32 nFracDenominator;
...@@ -121,7 +122,7 @@ struct SvXMLNumberInfo ...@@ -121,7 +122,7 @@ struct SvXMLNumberInfo
SvXMLNumberInfo() SvXMLNumberInfo()
{ {
nDecimals = nInteger = nExpDigits = nNumerDigits = nDenomDigits = nFracDenominator = -1; nDecimals = nInteger = nExpDigits = nExpInterval = nNumerDigits = nDenomDigits = nFracDenominator = -1;
bGrouping = bDecReplace = bVarDecimals = false; bGrouping = bDecReplace = bVarDecimals = false;
fDisplayFactor = 1.0; fDisplayFactor = 1.0;
} }
...@@ -203,7 +204,7 @@ public: ...@@ -203,7 +204,7 @@ public:
class SvXMLNumFmtPropContext : public SvXMLImportContext class SvXMLNumFmtPropContext : public SvXMLImportContext
{ {
SvXMLNumFormatContext& rParent; SvXMLNumFormatContext& rParent;
sal_Int32 m_nColor; sal_Int32 m_nColor;
bool bColSet; bool bColSet;
public: public:
...@@ -276,6 +277,7 @@ enum SvXMLStyleElemAttrTokens ...@@ -276,6 +277,7 @@ enum SvXMLStyleElemAttrTokens
XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT, XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT,
XML_TOK_ELEM_ATTR_DENOMINATOR_VALUE, XML_TOK_ELEM_ATTR_DENOMINATOR_VALUE,
XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS, XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS,
XML_TOK_ELEM_ATTR_EXPONENT_INTERVAL,
XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS,
XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS,
XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG, XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG,
...@@ -571,6 +573,8 @@ const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap() ...@@ -571,6 +573,8 @@ const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap()
{ XML_NAMESPACE_NUMBER, XML_DECIMAL_REPLACEMENT, XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT }, { XML_NAMESPACE_NUMBER, XML_DECIMAL_REPLACEMENT, XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT },
{ XML_NAMESPACE_NUMBER, XML_DENOMINATOR_VALUE, XML_TOK_ELEM_ATTR_DENOMINATOR_VALUE }, { XML_NAMESPACE_NUMBER, XML_DENOMINATOR_VALUE, XML_TOK_ELEM_ATTR_DENOMINATOR_VALUE },
{ XML_NAMESPACE_NUMBER, XML_MIN_EXPONENT_DIGITS, XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS }, { XML_NAMESPACE_NUMBER, XML_MIN_EXPONENT_DIGITS, XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS },
// number:exponent-interval will be supported in ODF 1.3
{ XML_NAMESPACE_LO_EXT, XML_EXPONENT_INTERVAL, XML_TOK_ELEM_ATTR_EXPONENT_INTERVAL },
{ XML_NAMESPACE_NUMBER, XML_MIN_NUMERATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS }, { XML_NAMESPACE_NUMBER, XML_MIN_NUMERATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS },
{ XML_NAMESPACE_NUMBER, XML_MIN_DENOMINATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS }, { XML_NAMESPACE_NUMBER, XML_MIN_DENOMINATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS },
{ XML_NAMESPACE_NUMBER, XML_RFC_LANGUAGE_TAG, XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG }, { XML_NAMESPACE_NUMBER, XML_RFC_LANGUAGE_TAG, XML_TOK_ELEM_ATTR_RFC_LANGUAGE_TAG },
...@@ -958,6 +962,10 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport, ...@@ -958,6 +962,10 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport,
if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 )) if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
aNumInfo.nExpDigits = nAttrVal; aNumInfo.nExpDigits = nAttrVal;
break; break;
case XML_TOK_ELEM_ATTR_EXPONENT_INTERVAL:
if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
aNumInfo.nExpInterval = nAttrVal;
break;
case XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS: case XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS:
if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 )) if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
aNumInfo.nNumerDigits = nAttrVal; aNumInfo.nNumerDigits = nAttrVal;
...@@ -1219,6 +1227,14 @@ void SvXMLNumFmtElementContext::EndElement() ...@@ -1219,6 +1227,14 @@ void SvXMLNumFmtElementContext::EndElement()
case XML_TOK_STYLE_SCIENTIFIC_NUMBER: case XML_TOK_STYLE_SCIENTIFIC_NUMBER:
{ {
// exponential interval for engineering notation
if( !aNumInfo.bGrouping && aNumInfo.nExpInterval > aNumInfo.nInteger )
{
for (sal_Int32 i=0; i<aNumInfo.nExpInterval-aNumInfo.nInteger; i++)
{
rParent.AddToCode( '#' );
}
}
rParent.AddNumber( aNumInfo ); // simple number rParent.AddNumber( aNumInfo ); // simple number
rParent.AddToCode( OUString("E+") ); rParent.AddToCode( OUString("E+") );
...@@ -1792,6 +1808,32 @@ void SvXMLNumFormatContext::AddNumber( const SvXMLNumberInfo& rInfo ) ...@@ -1792,6 +1808,32 @@ void SvXMLNumFormatContext::AddNumber( const SvXMLNumberInfo& rInfo )
aNumStr.stripStart('#'); aNumStr.stripStart('#');
} }
if ( bGrouping && rInfo.nExpInterval > rInfo.nInteger )
{
sal_Int32 nIndex = 0;
sal_Int32 nDigits = rInfo.nInteger;
sal_Int32 nIntegerEnd = aNumStr.indexOf( pFormatter->GetNumDecimalSep() );
if ( nIntegerEnd < 0 )
nIntegerEnd = aNumStr.getLength();
while ( nIndex >= 0 && nIndex < nIntegerEnd )
{
if ( ( nIndex = aNumStr.indexOf( '#', nIndex ) ) >= 0 )
{
nDigits ++;
nIndex ++;
}
else
nIndex = -1;
}
if( rInfo.nExpInterval > nDigits )
{
for (sal_Int32 i=0; i<rInfo.nExpInterval-nDigits; i++)
{
aNumStr.insert( 0, '#' );
}
}
}
if ( nEmbeddedCount ) if ( nEmbeddedCount )
{ {
// insert embedded strings into number string // insert embedded strings into number string
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment