Kaydet (Commit) c290f692 authored tarafından Laurent BP's avatar Laurent BP Kaydeden (comit) Eike Rathke

tdf#118324 Extend ODF for blank in integer

Following resolution of tdf#117575, this commit add
disambiguation between '0' and '?' in integer part
XML_MAX_BLANK_INTEGER_DIGITS is added for the number of '?'
XML_MIN_INTEGER_DIGITS is the number of '?' and '0'
This preserve compatibility with previous versions:
in previous versions '?' will be transformed in '0'
It also applies to scientific and fraction numbers.

Change-Id: I6e1185bbece9c615240425cc973d59052b22aa34
Reviewed-on: https://gerrit.libreoffice.org/56352
Tested-by: Jenkins
Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
üst 1f66bd9c
......@@ -64,12 +64,12 @@ private:
SAL_DLLPRIVATE void WriteColorElement_Impl( const Color& rColor );
SAL_DLLPRIVATE void WriteNumberElement_Impl( sal_Int32 nDecimals, sal_Int32 nMinDecimals,
sal_Int32 nInteger, const OUString& rDashStr,
sal_Int32 nInteger, sal_Int32 nBlankInteger, const OUString& rDashStr,
bool bGrouping, sal_Int32 nTrailingThousands,
const SvXMLEmbeddedTextEntryArr& rEmbeddedEntries );
SAL_DLLPRIVATE void WriteScientificElement_Impl( sal_Int32 nDecimals, sal_Int32 nMinDecimals, sal_Int32 nInteger,
SAL_DLLPRIVATE void WriteScientificElement_Impl( sal_Int32 nDecimals, sal_Int32 nMinDecimals, sal_Int32 nInteger, sal_Int32 nBlankInteger,
bool bGrouping, sal_Int32 nExp, sal_Int32 nExpInterval, bool bExpSign );
SAL_DLLPRIVATE void WriteFractionElement_Impl( sal_Int32 nInteger, bool bGrouping,
SAL_DLLPRIVATE void WriteFractionElement_Impl( sal_Int32 nInteger, sal_Int32 nBlankInteger, bool bGrouping,
const SvNumberformat& rFormat, sal_uInt16 nPart );
SAL_DLLPRIVATE void WriteCurrencyElement_Impl( const OUString& rString,
const OUString& rExt );
......
......@@ -157,7 +157,7 @@ class XMLOFF_DLLPUBLIC SvXMLNumFormatContext : public SvXMLStyleContext
public:
SvXMLNumFormatContext( SvXMLImport& rImport,
sal_uInt16 nPrfx,
sal_uInt16 nPrfx,
const OUString& rLName,
SvXMLNumImpData* pNewData,
sal_uInt16 nNewType,
......
......@@ -3316,6 +3316,7 @@ namespace xmloff { namespace token {
XML_ZEROS_NUMERATOR_DIGITS,
XML_ZEROS_DENOMINATOR_DIGITS,
XML_INTEGER_FRACTION_DELIMITER,
XML_MAX_BLANK_INTEGER_DIGITS,
// tdf#115319
XML_REFERENCE_LANGUAGE,
......
......@@ -4755,9 +4755,10 @@ void SvNumberformat::GetNumForInfo( sal_uInt16 nNumFor, SvNumFormatType& rScanne
{
p++;
}
while ( *p++ == '0' )
while ( *p == '0' || *p == '?' )
{
nLeadingCnt++;
p++;
}
}
else if (nType == NF_SYMBOLTYPE_DECSEP
......
......@@ -3309,6 +3309,7 @@ namespace xmloff { namespace token {
TOKEN( "zeros-numerator-digits", XML_ZEROS_NUMERATOR_DIGITS ),
TOKEN( "zeros-denominator-digits", XML_ZEROS_DENOMINATOR_DIGITS ),
TOKEN( "integer-fraction-delimiter", XML_INTEGER_FRACTION_DELIMITER ),
TOKEN( "max-blank-integer-digits", XML_MAX_BLANK_INTEGER_DIGITS ),
// for optional language-dependent reference formats
TOKEN( "reference-language", XML_REFERENCE_LANGUAGE ),
......
......@@ -92,7 +92,8 @@ public:
struct SvXMLNumberInfo
{
sal_Int32 nDecimals;
sal_Int32 nInteger;
sal_Int32 nInteger; /// Total min number of digits in integer part ('0' + '?')
sal_Int32 nBlankInteger; /// Number of '?' in integer part
sal_Int32 nExpDigits;
sal_Int32 nExpInterval;
sal_Int32 nMinNumerDigits;
......@@ -113,7 +114,7 @@ struct SvXMLNumberInfo
SvXMLNumberInfo()
{
nDecimals = nInteger = nExpDigits = nExpInterval = nMinNumerDigits = nMinDenomDigits = nMaxNumerDigits = nMaxDenomDigits =
nDecimals = nInteger = nBlankInteger = nExpDigits = nExpInterval = nMinNumerDigits = nMinDenomDigits = nMaxNumerDigits = nMaxDenomDigits =
nFracDenominator = nMinDecimalDigits = nZerosNumerDigits = nZerosDenomDigits = -1;
bGrouping = bDecReplace = bDecAlign = false;
bExpSign = true;
......@@ -253,6 +254,7 @@ enum SvXMLStyleElemAttrTokens
XML_TOK_ELEM_ATTR_DECIMAL_PLACES,
XML_TOK_ELEM_ATTR_MIN_DECIMAL_PLACES,
XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS,
XML_TOK_ELEM_ATTR_MAX_BLANK_INTEGER_DIGITS,
XML_TOK_ELEM_ATTR_GROUPING,
XML_TOK_ELEM_ATTR_DISPLAY_FACTOR,
XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT,
......@@ -544,6 +546,8 @@ const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap()
{ XML_NAMESPACE_LO_EXT, XML_MIN_DECIMAL_PLACES, XML_TOK_ELEM_ATTR_MIN_DECIMAL_PLACES },
{ XML_NAMESPACE_NUMBER, XML_MIN_DECIMAL_PLACES, XML_TOK_ELEM_ATTR_MIN_DECIMAL_PLACES },
{ XML_NAMESPACE_NUMBER, XML_MIN_INTEGER_DIGITS, XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS },
{ XML_NAMESPACE_LO_EXT, XML_MAX_BLANK_INTEGER_DIGITS,XML_TOK_ELEM_ATTR_MAX_BLANK_INTEGER_DIGITS },
{ XML_NAMESPACE_NUMBER, XML_MAX_BLANK_INTEGER_DIGITS,XML_TOK_ELEM_ATTR_MAX_BLANK_INTEGER_DIGITS },
{ XML_NAMESPACE_NUMBER, XML_GROUPING, XML_TOK_ELEM_ATTR_GROUPING },
{ XML_NAMESPACE_NUMBER, XML_DISPLAY_FACTOR, XML_TOK_ELEM_ATTR_DISPLAY_FACTOR },
{ XML_NAMESPACE_NUMBER, XML_DECIMAL_REPLACEMENT, XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT },
......@@ -931,6 +935,10 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport,
if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
aNumInfo.nInteger = nAttrVal;
break;
case XML_TOK_ELEM_ATTR_MAX_BLANK_INTEGER_DIGITS:
if (::sax::Converter::convertNumber( nAttrVal, sValue, 0 ))
aNumInfo.nBlankInteger = nAttrVal;
break;
case XML_TOK_ELEM_ATTR_GROUPING:
if (::sax::Converter::convertBool( bAttrBool, sValue ))
aNumInfo.bGrouping = bAttrBool;
......@@ -1024,6 +1032,8 @@ SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport,
break;
}
}
if ( aNumInfo.nBlankInteger > aNumInfo.nInteger )
aNumInfo.nInteger = aNumInfo.nBlankInteger;
if ( aNumInfo.nMinDecimalDigits == -1)
{
if ( bVarDecimals || aNumInfo.bDecReplace )
......@@ -1894,6 +1904,25 @@ void SvXMLNumFormatContext::AddNumber( const SvXMLNumberInfo& rInfo )
aNumStr.stripStart('#');
}
if ( rInfo.nBlankInteger > 0 )
{
// Replace nBlankInteger '0' by '?'
sal_Int32 nIndex = 0;
sal_Int32 nBlanks = rInfo.nBlankInteger;
sal_Int32 nIntegerEnd = aNumStr.indexOf( pFormatter->GetNumDecimalSep() );
if ( nIntegerEnd < 0 )
nIntegerEnd = aNumStr.getLength();
while ( nIndex < nIntegerEnd && nBlanks > 0 )
{
if ( aNumStr[nIndex] == '0' )
{
aNumStr[nIndex] = '?';
nBlanks--;
}
nIndex++;
}
}
if ( bGrouping && rInfo.nExpInterval > rInfo.nInteger )
{
sal_Int32 nIndex = 0;
......
......@@ -3084,6 +3084,7 @@ max-numerator-digits
zeros-numerator-digits
zeros-denominator-digits
integer-fraction-delimiter
max-blank-integer-digits
reference-language
newline
creator-initials
......
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