johnlemon
johnlemon

Reputation: 21449

Php get current locale for LC_MONETARY

I'm using this code to display an amount in the current locale.

setlocale(LC_MONETARY, 'it_IT');
echo money_format('%i', $number);

My question is, how can I see the current value for LC_MONETARY ? If I do a simple echo the value seems the same and I can't find any getlocale function.

echo LC_MONETARY;
setlocale(LC_MONETARY, 'it_IT');
echo LC_MONETARY;

Update : LC_MONETARY is the category of function affected so it makes sense the value is the same. But how can I see the current locale info then ?

Upvotes: 2

Views: 16504

Answers (3)

Stefan Gehrig
Stefan Gehrig

Reputation: 83622

$oldLocale = setlocale(LC_MONETARY, 'it_IT');
// setlocale() will return the old value if the locale could 
// be set (return value greatly depends on the system's underlying 
// setlocale() implementation)

$oldLocale = setlocale(LC_MONETARY, '0');
// using '0' as the locale-argument will result in the current setting 
//being returned without affecting the locale setting itself

See the note for the $locale parameter in the setlocale() documentation.

Upvotes: 18

Adam
Adam

Reputation: 2889

Have a look at the localeconv() function (http://www.php.net/manual/en/function.localeconv.php):

print_r(localeconv());

Outputs (depending on what you set with setlocale()):

Array
(
    [decimal_point] => .
    [thousands_sep] =>
    [int_curr_symbol] => EUR
    [currency_symbol] => €
    [mon_decimal_point] => ,
    [mon_thousands_sep] =>
    [positive_sign] =>
    [negative_sign] => -
    [int_frac_digits] => 2
    [frac_digits] => 2
    [p_cs_precedes] => 1
    [p_sep_by_space] => 1
    [n_cs_precedes] => 1
    [n_sep_by_space] => 1
    [p_sign_posn] => 1
    [n_sign_posn] => 2
    [grouping] => Array
        (
        )

    [mon_grouping] => Array
        (
            [0] => 3
            [1] => 3
        )

)

The main thing you'll probably care about is the int_curr_symbol result.

$data = localeconv();
$symbol = $data['int_curr_symbol'];

switch($symbol){
    case 'EUR':
        // Euro
        break;

    case 'USD':
        // US Dollars
        break;

    // ...
}

Upvotes: 0

deceze
deceze

Reputation: 522015

The value of the constant LC_MONETARY will never change. When setting a locale with setlocale(LC_MONETARY, ...), you're not changing the LC_MONETARY constant, you're setting the locale for the "monetary" category. This locale setting happens in the background and is not visible outwardly. The LC_MONETARY constant is just an identifier for the category.

Usually you don't need to know what's currently set. You should simply set your desired locale when needed.

Upvotes: 1

Related Questions