I18N-Langinfo: Use new fcn Perl_langinfo()
authorKarl Williamson <khw@cpan.org>
Thu, 7 Sep 2017 22:33:09 +0000 (16:33 -0600)
committerKarl Williamson <khw@cpan.org>
Sun, 10 Sep 2017 03:27:46 +0000 (21:27 -0600)
This automatically fixes the bug where it always returned a dot for the
decimal point character.

ext/I18N-Langinfo/Langinfo.pm
ext/I18N-Langinfo/Langinfo.xs
ext/I18N-Langinfo/t/Langinfo.t
pod/perldelta.pod
pod/perllocale.pod

index 033d8de..1b1a480 100644 (file)
@@ -72,7 +72,7 @@ our @EXPORT_OK = qw(
        YESSTR
 );
 
-our $VERSION = '0.13';
+our $VERSION = '0.14';
 
 XSLoader::load();
 
@@ -90,7 +90,9 @@ I18N::Langinfo - query locale information
 =head1 DESCRIPTION
 
 The langinfo() function queries various locale information that can be
-used to localize output and user interfaces.  The langinfo() requires
+used to localize output and user interfaces.  It uses the current underlying
+locale, regardless of whether or not it was called from within the scope of
+S<C<use locale>>.  The langinfo() requires
 one numeric argument that identifies the locale constant to query:
 if no argument is supplied, C<$_> is used.  The numeric constants
 appropriate to be used as arguments are exportable from I18N::Langinfo.
index 582b7fa..aae48c2 100644 (file)
@@ -27,7 +27,7 @@ langinfo(code)
            SETERRNO(EINVAL, LIB_INVARG);
            RETVAL = &PL_sv_undef;
        } else {
-            RETVAL = newSVpv(nl_langinfo(code), 0);
+            RETVAL = newSVpv(Perl_langinfo(code), 0);
         }
 #else
        croak("nl_langinfo() not implemented on this architecture");
index 25d30e6..10a660e 100644 (file)
@@ -2,6 +2,7 @@
 use strict;
 use Config;
 use Test::More;
+require "../../t/loc_tools.pl";
 
 plan skip_all => "I18N::Langinfo or POSIX unavailable" 
     if $Config{'extensions'} !~ m!\bI18N/Langinfo\b!;
@@ -20,7 +21,7 @@ my %want =
 
 my @want = sort keys %want;
 
-plan tests => 1 + 3 * @constants + keys(@want);
+plan tests => 1 + 3 * @constants + keys(@want) + 1;
 
 use_ok('I18N::Langinfo', 'langinfo', @constants);
 
@@ -46,3 +47,25 @@ for my $i (1..@want) {
         is (langinfo(&$try), $want{$try}, "$try => '$want{$try}'");
     }
 }
+
+my $comma_locale;
+for (find_locales( [ 'LC_NUMERIC' ] )) {
+    use POSIX;
+    use locale;
+    setlocale(LC_NUMERIC, $_) or next;
+    my $in = 4.2; # avoid any constant folding bugs
+    my $s = sprintf("%g", $in);
+    if ($s eq "4,2")  {
+        $comma_locale = $_;
+        last;
+    }
+}
+
+SKIP: {
+    skip "Couldn't find a locale with a comma decimal pt", 1
+                                                        unless $comma_locale;
+
+    no strict 'refs';
+    is (langinfo(&RADIXCHAR), ",",
+        "Returns ',' for decimal pt for locale '$comma_locale'");
+}
index 0db7df4..51a7a4d 100644 (file)
@@ -125,7 +125,10 @@ XXX
 
 =item *
 
-L<XXX> has been upgraded from version A.xx to B.yy.
+L<I18N::Langinfo> has been upgraded from version 0.13 to 0.13.
+This fixes a bug in which the underlying locale was ignored for the
+C<RADIXCHAR> (always was returned as a dot, and the C<THOUSEP> (always
+empty).  Now the locale-appropriate values are returned.
 
 =back
 
index 8e30085..c7e683a 100644 (file)
@@ -225,6 +225,8 @@ C<POSIX::strxfrm()> use C<LC_COLLATE>.  All such functions
 will behave according to the current underlying locale, even if that
 locale isn't exposed to Perl space.
 
+This applies as well to L<I18N::Langinfo>.
+
 =item *
 
 XS modules for all categories but C<LC_NUMERIC> get the underlying