- if (lc && lc->decimal_point) {
- if (lc->decimal_point[0] == '.' && lc->decimal_point[1] == 0) {
- SvREFCNT_dec(PL_numeric_radix_sv);
- PL_numeric_radix_sv = NULL;
- }
- else {
- if (PL_numeric_radix_sv)
- sv_setpv(PL_numeric_radix_sv, lc->decimal_point);
- else
- PL_numeric_radix_sv = newSVpv(lc->decimal_point, 0);
- if (! is_utf8_invariant_string((U8 *) lc->decimal_point, 0)
- && is_utf8_string((U8 *) lc->decimal_point, 0)
+#if defined(USE_LOCALE_NUMERIC) && ( defined(HAS_LOCALECONV) \
+ || defined(HAS_NL_LANGINFO))
+
+ /* We only set up the radix SV if we are to use a locale radix ... */
+ if (use_locale) {
+ const char * radix = my_nl_langinfo(PERL_RADIXCHAR, FALSE);
+ /* FALSE => already in dest locale */
+
+ /* ... and the character being used isn't a dot */
+ if (strNE(radix, ".")) {
+ if (PL_numeric_radix_sv) {
+ sv_setpv(PL_numeric_radix_sv, radix);
+ }
+ else {
+ PL_numeric_radix_sv = newSVpv(radix, 0);
+ }
+
+ if ( ! is_utf8_invariant_string(
+ (U8 *) SvPVX(PL_numeric_radix_sv), SvCUR(PL_numeric_radix_sv))
+ && is_utf8_string(
+ (U8 *) SvPVX(PL_numeric_radix_sv), SvCUR(PL_numeric_radix_sv))