mirror of
https://gitlab.gnome.org/GNOME/libxslt
synced 2025-11-04 00:53:12 +03:00
applied a patch from Ken Neighbors fixing some format-number
* libxslt/numbers.c libxslt/numbersInternals.h: applied a patch from Ken Neighbors fixing some format-number inconsistencies * tests/numbers/format-number.out tests/numbers/format-number.xml tests/numbers/format-number.xsl: the patch also included updates to the regression tests Daniel
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
Sat Jun 15 15:44:58 CEST 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* libxslt/numbers.c libxslt/numbersInternals.h: applied a
|
||||||
|
patch from Ken Neighbors fixing some format-number inconsistencies
|
||||||
|
* tests/numbers/format-number.out tests/numbers/format-number.xml
|
||||||
|
tests/numbers/format-number.xsl: the patch also included
|
||||||
|
updates to the regression tests
|
||||||
|
|
||||||
Mon Jun 10 14:55:31 CEST 2002 Daniel Veillard <daniel@veillard.com>
|
Mon Jun 10 14:55:31 CEST 2002 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
* libxslt/numbers.c: patch from Richard Jinks t correct a bug in
|
* libxslt/numbers.c: patch from Richard Jinks t correct a bug in
|
||||||
|
|||||||
@@ -109,16 +109,19 @@ xsltNumberFormatDecimal(xmlBufferPtr buffer,
|
|||||||
/* Build buffer from back */
|
/* Build buffer from back */
|
||||||
pointer = &temp_string[sizeof(temp_string)];
|
pointer = &temp_string[sizeof(temp_string)];
|
||||||
*(--pointer) = 0;
|
*(--pointer) = 0;
|
||||||
for (i = 1; i < (int)sizeof(temp_string); i++) {
|
i = 0;
|
||||||
*(--pointer) = digit_zero + (int)fmod(number, 10.0);
|
while (pointer > temp_string) {
|
||||||
number /= 10.0;
|
|
||||||
if ((i >= width) && (fabs(number) < 1.0))
|
if ((i >= width) && (fabs(number) < 1.0))
|
||||||
break; /* for */
|
break; /* for */
|
||||||
if ((groupingCharacter != 0) &&
|
if ((i > 0) && (groupingCharacter != 0) &&
|
||||||
(digitsPerGroup > 0) &&
|
(digitsPerGroup > 0) &&
|
||||||
((i % digitsPerGroup) == 0)) {
|
((i % digitsPerGroup) == 0)) {
|
||||||
*(--pointer) = groupingCharacter;
|
*(--pointer) = groupingCharacter;
|
||||||
}
|
}
|
||||||
|
if (pointer > temp_string)
|
||||||
|
*(--pointer) = digit_zero + (int)fmod(number, 10.0);
|
||||||
|
number /= 10.0;
|
||||||
|
++i;
|
||||||
}
|
}
|
||||||
xmlBufferCat(buffer, pointer);
|
xmlBufferCat(buffer, pointer);
|
||||||
}
|
}
|
||||||
@@ -871,11 +874,13 @@ xsltFormatNumberConversion(xsltDecimalFormatPtr self,
|
|||||||
return XPATH_MEMORY_ERROR;
|
return XPATH_MEMORY_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
format_info.integer_hash = 0;
|
||||||
format_info.integer_digits = 0;
|
format_info.integer_digits = 0;
|
||||||
format_info.frac_digits = 0;
|
format_info.frac_digits = 0;
|
||||||
format_info.frac_hash = 0;
|
format_info.frac_hash = 0;
|
||||||
format_info.group = -1;
|
format_info.group = -1;
|
||||||
format_info.multiplier = 1;
|
format_info.multiplier = 1;
|
||||||
|
format_info.add_decimal = FALSE;
|
||||||
format_info.is_multiplier_set = FALSE;
|
format_info.is_multiplier_set = FALSE;
|
||||||
format_info.is_negative_pattern = FALSE;
|
format_info.is_negative_pattern = FALSE;
|
||||||
|
|
||||||
@@ -906,6 +911,7 @@ xsltFormatNumberConversion(xsltDecimalFormatPtr self,
|
|||||||
found_error = 1;
|
found_error = 1;
|
||||||
goto OUTPUT_NUMBER;
|
goto OUTPUT_NUMBER;
|
||||||
}
|
}
|
||||||
|
format_info.integer_hash++;
|
||||||
if (format_info.group >= 0)
|
if (format_info.group >= 0)
|
||||||
format_info.group++;
|
format_info.group++;
|
||||||
} else if (*the_format == self->zeroDigit[0]) {
|
} else if (*the_format == self->zeroDigit[0]) {
|
||||||
@@ -934,8 +940,10 @@ xsltFormatNumberConversion(xsltDecimalFormatPtr self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We have finished the integer part, now work on fraction */
|
/* We have finished the integer part, now work on fraction */
|
||||||
if (*the_format == self->decimalPoint[0])
|
if (*the_format == self->decimalPoint[0]) {
|
||||||
|
format_info.add_decimal = TRUE;
|
||||||
the_format++; /* Skip over the decimal */
|
the_format++; /* Skip over the decimal */
|
||||||
|
}
|
||||||
|
|
||||||
while (*the_format != 0) {
|
while (*the_format != 0) {
|
||||||
|
|
||||||
@@ -1070,11 +1078,13 @@ OUTPUT_NUMBER:
|
|||||||
"xsltFormatNumberConversion : error in format string, using default\n");
|
"xsltFormatNumberConversion : error in format string, using default\n");
|
||||||
default_sign = (number < 0.0) ? 1 : 0;
|
default_sign = (number < 0.0) ? 1 : 0;
|
||||||
prefix_length = suffix_length = 0;
|
prefix_length = suffix_length = 0;
|
||||||
|
format_info.integer_hash = 0;
|
||||||
format_info.integer_digits = 1;
|
format_info.integer_digits = 1;
|
||||||
format_info.frac_digits = 1;
|
format_info.frac_digits = 1;
|
||||||
format_info.frac_hash = 4;
|
format_info.frac_hash = 4;
|
||||||
format_info.group = -1;
|
format_info.group = -1;
|
||||||
format_info.multiplier = 1;
|
format_info.multiplier = 1;
|
||||||
|
format_info.add_decimal = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ready to output our number. First see if "default sign" is required */
|
/* Ready to output our number. First see if "default sign" is required */
|
||||||
@@ -1105,8 +1115,25 @@ OUTPUT_NUMBER:
|
|||||||
format_info.group,
|
format_info.group,
|
||||||
(xmlChar) ',');
|
(xmlChar) ',');
|
||||||
|
|
||||||
|
/* Special case: java treats '.#' like '.0', '.##' like '.0#', etc. */
|
||||||
|
if ((format_info.integer_digits + format_info.integer_hash +
|
||||||
|
format_info.frac_digits == 0) && (format_info.frac_hash > 0)) {
|
||||||
|
++format_info.frac_digits;
|
||||||
|
--format_info.frac_hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add leading zero, if required */
|
||||||
|
if ((floor(number) == 0) &&
|
||||||
|
(format_info.integer_digits + format_info.frac_digits == 0)) {
|
||||||
|
xmlBufferAdd(buffer, self->zeroDigit, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Next the fractional part, if required */
|
/* Next the fractional part, if required */
|
||||||
if (format_info.frac_digits + format_info.frac_hash > 0) {
|
if (format_info.frac_digits + format_info.frac_hash == 0) {
|
||||||
|
if (format_info.add_decimal)
|
||||||
|
xmlBufferAdd(buffer, self->decimalPoint, 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
number -= floor(number);
|
number -= floor(number);
|
||||||
if ((number != 0) || (format_info.frac_digits != 0)) {
|
if ((number != 0) || (format_info.frac_digits != 0)) {
|
||||||
xmlBufferAdd(buffer, self->decimalPoint, 1);
|
xmlBufferAdd(buffer, self->decimalPoint, 1);
|
||||||
|
|||||||
@@ -40,11 +40,13 @@ typedef struct _xsltNumberData {
|
|||||||
* This data structure lists the various parameters needed to format numbers.
|
* This data structure lists the various parameters needed to format numbers.
|
||||||
*/
|
*/
|
||||||
typedef struct _xsltFormatNumberInfo {
|
typedef struct _xsltFormatNumberInfo {
|
||||||
|
int integer_hash; /* Number of '#' in integer part */
|
||||||
int integer_digits; /* Number of '0' in integer part */
|
int integer_digits; /* Number of '0' in integer part */
|
||||||
int frac_digits; /* Number of '0' in fractional part */
|
int frac_digits; /* Number of '0' in fractional part */
|
||||||
int frac_hash; /* Number of '#' in fractional part */
|
int frac_hash; /* Number of '#' in fractional part */
|
||||||
int group; /* Number of chars per display 'group' */
|
int group; /* Number of chars per display 'group' */
|
||||||
int multiplier; /* Scaling for percent or permille */
|
int multiplier; /* Scaling for percent or permille */
|
||||||
|
char add_decimal; /* Flag for whether decimal point appears in pattern */
|
||||||
char is_multiplier_set; /* Flag to catch multiple occurences of percent/permille */
|
char is_multiplier_set; /* Flag to catch multiple occurences of percent/permille */
|
||||||
char is_negative_pattern;/* Flag for processing -ve prefix/suffix */
|
char is_negative_pattern;/* Flag for processing -ve prefix/suffix */
|
||||||
} xsltFormatNumberInfo, *xsltFormatNumberInfoPtr;
|
} xsltFormatNumberInfo, *xsltFormatNumberInfoPtr;
|
||||||
|
|||||||
@@ -1,7 +1,94 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
<pi>
|
<format-number>
|
||||||
|
<fixes>
|
||||||
one prefix3.14suffix
|
one prefix3.14suffix
|
||||||
two -_3.14_
|
two -_3.14_
|
||||||
three -_003.1415_
|
three -_003.1415_
|
||||||
four _(3.1)_
|
four _(3.1)_
|
||||||
five prefix3*14suffix</pi>
|
five prefix3*14suffix
|
||||||
|
</fixes>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'#' ) = -1
|
||||||
|
format-number(-0.5,'#' ) = -1
|
||||||
|
format-number( 0.0,'#' ) = 0
|
||||||
|
format-number( 0.5,'#' ) = 1
|
||||||
|
format-number( 1.0,'#' ) = 1
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'0' ) = -1
|
||||||
|
format-number(-0.5,'0' ) = -1
|
||||||
|
format-number( 0.0,'0' ) = 0
|
||||||
|
format-number( 0.5,'0' ) = 1
|
||||||
|
format-number( 1.0,'0' ) = 1
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0, '.' ) = -1.
|
||||||
|
format-number(-0.5, '.' ) = -1.
|
||||||
|
format-number( 0.0, '.' ) = 0.
|
||||||
|
format-number( 0.5, '.' ) = 1.
|
||||||
|
format-number( 1.0, '.' ) = 1.
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'#.' ) = -1.
|
||||||
|
format-number(-0.5,'#.' ) = -1.
|
||||||
|
format-number( 0.0,'#.' ) = 0.
|
||||||
|
format-number( 0.5,'#.' ) = 1.
|
||||||
|
format-number( 1.0,'#.' ) = 1.
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'0.' ) = -1.
|
||||||
|
format-number(-0.5,'0.' ) = -1.
|
||||||
|
format-number( 0.0,'0.' ) = 0.
|
||||||
|
format-number( 0.5,'0.' ) = 1.
|
||||||
|
format-number( 1.0,'0.' ) = 1.
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0, '.#') = -1.0
|
||||||
|
format-number(-0.5, '.#') = -.5
|
||||||
|
format-number( 0.0, '.#') = .0
|
||||||
|
format-number( 0.5, '.#') = .5
|
||||||
|
format-number( 1.0, '.#') = 1.0
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0, '.##') = -1.0
|
||||||
|
format-number(-0.5, '.##') = -.5
|
||||||
|
format-number( 0.0, '.##') = .0
|
||||||
|
format-number( 0.5, '.##') = .5
|
||||||
|
format-number( 1.0, '.##') = 1.0
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0, '.0') = -1.0
|
||||||
|
format-number(-0.5, '.0') = -.5
|
||||||
|
format-number( 0.0, '.0') = .0
|
||||||
|
format-number( 0.5, '.0') = .5
|
||||||
|
format-number( 1.0, '.0') = 1.0
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'#.#') = -1
|
||||||
|
format-number(-0.5,'#.#') = -0.5
|
||||||
|
format-number( 0.0,'#.#') = 0
|
||||||
|
format-number( 0.5,'#.#') = 0.5
|
||||||
|
format-number( 1.0,'#.#') = 1
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'0.0') = -1.0
|
||||||
|
format-number(-0.5,'0.0') = -0.5
|
||||||
|
format-number( 0.0,'0.0') = 0.0
|
||||||
|
format-number( 0.5,'0.0') = 0.5
|
||||||
|
format-number( 1.0,'0.0') = 1.0
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'#.0') = -1.0
|
||||||
|
format-number(-0.5,'#.0') = -.5
|
||||||
|
format-number( 0.0,'#.0') = .0
|
||||||
|
format-number( 0.5,'#.0') = .5
|
||||||
|
format-number( 1.0,'#.0') = 1.0
|
||||||
|
</point-test>
|
||||||
|
<point-test>
|
||||||
|
format-number(-1.0,'0.#') = -1
|
||||||
|
format-number(-0.5,'0.#') = -0.5
|
||||||
|
format-number( 0.0,'0.#') = 0
|
||||||
|
format-number( 0.5,'0.#') = 0.5
|
||||||
|
format-number( 1.0,'0.#') = 1
|
||||||
|
</point-test>
|
||||||
|
</format-number>
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
<functions>
|
<format-number>
|
||||||
|
<fixes>
|
||||||
<pi>3.1415</pi>
|
<pi>3.1415</pi>
|
||||||
<negpi>-3.1415</negpi>
|
<negpi>-3.1415</negpi>
|
||||||
</functions>
|
</fixes>
|
||||||
|
<point-test>
|
||||||
|
<number>-1.0</number>
|
||||||
|
<number>-0.5</number>
|
||||||
|
<number> 0.0</number>
|
||||||
|
<number> 0.5</number>
|
||||||
|
<number> 1.0</number>
|
||||||
|
</point-test>
|
||||||
|
</format-number>
|
||||||
|
|||||||
@@ -12,14 +12,119 @@
|
|||||||
decimal-separator = "*"
|
decimal-separator = "*"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<xsl:template match="functions">
|
<xsl:template match="/format-number">
|
||||||
<pi>
|
<format-number>
|
||||||
|
<xsl:apply-templates/>
|
||||||
|
</format-number>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template match="/format-number/fixes">
|
||||||
|
<fixes>
|
||||||
one <xsl:value-of select="format-number(pi, 'prefix#,#,###.##suffix')"/>
|
one <xsl:value-of select="format-number(pi, 'prefix#,#,###.##suffix')"/>
|
||||||
two <xsl:value-of select="format-number(negpi, '_#,#,###.##_')"/>
|
two <xsl:value-of select="format-number(negpi, '_#,#,###.##_')"/>
|
||||||
three <xsl:value-of select="format-number(negpi, '_#,#,000.000##_')"/>
|
three <xsl:value-of select="format-number(negpi, '_#,#,000.000##_')"/>
|
||||||
four <xsl:value-of select="format-number(negpi, '_#.#_;_(#.#)_')"/>
|
four <xsl:value-of select="format-number(negpi, '_#.#_;_(#.#)_')"/>
|
||||||
five <xsl:value-of select="format-number(pi, 'prefix#,#,###*##suffix','special')"/>
|
five <xsl:value-of select="format-number(pi, 'prefix#,#,###*##suffix','special')"/>
|
||||||
</pi>
|
<xsl:text> </xsl:text>
|
||||||
|
</fixes>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template match="/format-number/point-test">
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'#' )<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'#')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'0' )<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'0')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>, '.' )<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'.')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'#.' )<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'#.')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'0.' )<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'0.')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>, '.#')<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'.#')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>, '.##')<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'.##')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>, '.0')<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'.0')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'#.#')<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'#.#')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'0.0')<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'0.0')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'#.0')<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'#.0')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test><xsl:text> </xsl:text>
|
||||||
|
|
||||||
|
<point-test>
|
||||||
|
<xsl:for-each select="number">
|
||||||
|
format-number(<xsl:value-of select="."/>,'0.#')<xsl:text> = </xsl:text>
|
||||||
|
<xsl:value-of select="format-number(.,'0.#')"/>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:text> </xsl:text>
|
||||||
|
</point-test>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
|
||||||
</xsl:stylesheet>
|
</xsl:stylesheet>
|
||||||
|
|||||||
Reference in New Issue
Block a user