From: Hannes Magnusson Date: Mon, 18 Dec 2006 09:25:32 +0000 (+0000) Subject: - make %f locale aware again X-Git-Tag: RELEASE_1_0_0RC1~672 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=44693bbf8521f8ff9dbf648c7fec4d2e278cd100;p=php - make %f locale aware again - fix precision loss with %F (noticed by Sebastian Nohn) - add new tests --- diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c index d3536397b3..d9031841fe 100644 --- a/ext/standard/formatted_print.c +++ b/ext/standard/formatted_print.c @@ -222,15 +222,13 @@ php_sprintf_appenddouble(char **buffer, int *pos, } switch (fmt) { - case 'F': - fmt = 'f'; - /* break is missing */ case 'e': if (precision) { precision--; } case 'E': case 'f': + case 'F': s = ap_php_conv_fp(fmt, number, 0, precision, &is_negative, &num_buf[1], &s_len); if (is_negative) { diff --git a/ext/standard/tests/strings/sprintf_f_2.phpt b/ext/standard/tests/strings/sprintf_f_2.phpt new file mode 100755 index 0000000000..f79a234663 --- /dev/null +++ b/ext/standard/tests/strings/sprintf_f_2.phpt @@ -0,0 +1,115 @@ +--TEST-- +sprintf #2 +--FILE-- + +--EXPECT-- + +string(7) "100.426" +string(6) "100.43" +string(3) "100" +string(3) "100" +string(3) "144" +string(3) "144" +string(34) "There are 100 monkeys in the world" +string(28) "The 100.1 contains 0 monkeys" +string(30) "The world contains 100 monkeys" +string(76) "The world contains 100 monkeys. + That's a nice world full of 100 monkeys." +string(33) "%b = '10100111101010011010101101'" +string(8) "%c = 'A'" +string(15) "%d = '43951789'" +string(17) "%e = '4.39518e+7'" +string(15) "%u = '43951789'" +string(17) "%u = '4251015507'" +string(22) "%f = '43951789.000000'" +string(16) "%o = '247523255'" +string(15) "%s = '43951789'" +string(14) "%x = '29ea6ad'" +string(14) "%X = '29EA6AD'" +string(17) "%+d = '+43951789'" +string(17) "%+d = '-43951789'" +string(8) "[monkey]" +string(12) "[ monkey]" +string(12) "[monkey ]" +string(12) "[0000monkey]" +string(12) "[####monkey]" +string(12) "[many monke]" +string(10) "2006-12-18" +string(6) "123.10" +string(7) "3.63e+8" diff --git a/ext/standard/tests/strings/sprintf_f_3.phpt b/ext/standard/tests/strings/sprintf_f_3.phpt new file mode 100755 index 0000000000..1db221466a --- /dev/null +++ b/ext/standard/tests/strings/sprintf_f_3.phpt @@ -0,0 +1,25 @@ +--TEST-- +sprintf #2 +--INI-- +error_reporting=6143 +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(7) "100,426" +string(6) "100,43" +string(11) "100,426000'" +string(6) "123,10" +string(7) "1.23e+2" diff --git a/main/snprintf.c b/main/snprintf.c index 3dd2ebf93f..30f99c575b 100644 --- a/main/snprintf.c +++ b/main/snprintf.c @@ -363,12 +363,20 @@ char * ap_php_conv_fp(register char format, register double num, register char *s = buf; register char *p, *p_orig; int decimal_point; + char dec_point = '.'; + + if (format == 'f') { + struct lconv *lconv; + lconv = localeconv(); + dec_point = *lconv->decimal_point; + format = 'F'; + } if (precision >= NDIG - 1) { precision = NDIG - 2; } - if (format == 'f') + if (format == 'F') p_orig = p = bsd_fcvt(num, precision, &decimal_point, is_negative); else /* either e or E format */ p_orig = p = bsd_ecvt(num, precision + 1, &decimal_point, is_negative); @@ -383,16 +391,16 @@ char * ap_php_conv_fp(register char format, register double num, free(p_orig); return (buf); } - if (format == 'f') { + if (format == 'F') { if (decimal_point <= 0) { if (num != 0 || precision > 0) { *s++ = '0'; if (precision > 0) { - *s++ = '.'; + *s++ = dec_point; while (decimal_point++ < 0) *s++ = '0'; } else if (add_dp) { - *s++ = '.'; + *s++ = dec_point; } } } else { @@ -405,7 +413,7 @@ char * ap_php_conv_fp(register char format, register double num, *s++ = '0'; } if (precision > 0 || add_dp) { - *s++ = '.'; + *s++ = dec_point; } } } else { @@ -420,7 +428,7 @@ char * ap_php_conv_fp(register char format, register double num, while (*p) *s++ = *p++; - if (format != 'f') { + if (format != 'F') { char temp[EXPONENT_LENGTH]; /* for exponent conversion */ int t_len; bool_int exponent_is_negative;