print "# failed $locales_test_number locale '$Locale' characters @f\n"
}
}
+
+ # [perl #109318]
+ {
+ my @f = ();
+ ++$locales_test_number;
+ $test_names{$locales_test_number} = 'Verify atof with locale radix and negative exponent';
+
+ my $radix = POSIX::localeconv()->{decimal_point};
+ my @nums = (
+ "3.14e+9", "3${radix}14e+9", "3.14e-9", "3${radix}14e-9",
+ "-3.14e+9", "-3${radix}14e+9", "-3.14e-9", "-3${radix}14e-9",
+ );
+
+ if (! $is_utf8_locale) {
+ use locale;
+ for my $num (@nums) {
+ push @f, $num
+ unless sprintf("%g", $num) =~ /3.+14/;
+ }
+ }
+ else {
+ use locale ':not_characters';
+ for my $num (@nums) {
+ push @f, $num
+ unless sprintf("%g", $num) =~ /3.+14/;
+ }
+ }
+
+ tryneoalpha($Locale, $locales_test_number, @f == 0);
+ if (@f) {
+ print "# failed $locales_test_number locale '$Locale' numbers @f\n"
+ }
+ }
}
my $final_locales_test_number = $locales_test_number;
PERL_ARGS_ASSERT_MY_ATOF;
- if (PL_numeric_local && IN_SOME_LOCALE_FORM) {
- NV y;
+ if (PL_numeric_local && PL_numeric_radix_sv && IN_SOME_LOCALE_FORM) {
+ char *standard = NULL, *local = NULL;
+ bool use_standard_radix;
- /* Scan the number twice; once using locale and once without;
- * choose the larger result (in absolute value). */
- Perl_atof2(s, x);
- SET_NUMERIC_STANDARD();
- Perl_atof2(s, y);
- SET_NUMERIC_LOCAL();
- if ((y < 0.0 && y < x) || (y > 0.0 && y > x))
- return y;
+ standard = strchr(s, '.');
+ local = strstr(s, SvPV_nolen(PL_numeric_radix_sv));
+
+ use_standard_radix = standard && (!local || standard < local);
+
+ if (use_standard_radix)
+ SET_NUMERIC_STANDARD();
+
+ Perl_atof2(s, x);
+
+ if (use_standard_radix)
+ SET_NUMERIC_LOCAL();
}
else
Perl_atof2(s, x);