std::lconv(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… NAME πŸ’…

std::lconv β€” bestie, it's std::lconv. That's it. That's the name. (We're in the C++ Standard Library, section 3, and yes I will be making this whole thing cute, no cap.)


✨ SYNOPSIS ✨

Defined in header <clocale>:

struct lconv;

Okay so picture this: std::lconv is literally the struct that holds all your numeric and monetary formatting rules, exactly as defined by a C locale. That's its whole job and it does it slayfully. 🌸

You don't just make one yourself, though β€” objects of this struct may be obtained with std::localeconv. Rude of it to be gatekept but okay.

So the members of std::lconv are values of type char and values of type char*. And here's the little detail everyone forgets: each char* member except decimal_point may be pointing at a null character (that is, at an empty C-string). Yeah. Empty. Don't assume you got a real string, queen. πŸ™ˆ

And the members of type char are all non-negative numbers, any of which may be CHAR_MAX if the corresponding value is not available in the current C locale. So if you see CHAR_MAX bestie, that's not a number, that's a "we don't have this, sorry." πŸ’€


πŸŽ€ MEMBER OBJECTS πŸŽ€

πŸ“ Non-monetary numeric formatting parameters

  • char* decimal_point β€” the character used as the decimal point (public member object)
  • char* thousands_sep β€” the character used to separate groups of digits before the decimal point (public member object)
  • char* grouping β€” a string whose elements indicate the sizes of digit groups (public member object)

🧚 Monetary numeric formatting parameters

  • char* mon_decimal_point β€” the character used as the decimal point (public member object)
  • char* mon_thousands_sep β€” the character used to separate groups of digits before the decimal point (public member object)
  • char* mon_grouping β€” a string whose elements indicate the sizes of digit groups (public member object)
  • char* positive_sign β€” a string used to indicate non-negative monetary quantity (public member object)
  • char* negative_sign β€” a string used to indicate negative monetary quantity (public member object)

πŸ‘‘ Local monetary numeric formatting parameters

  • char* currency_symbol β€” the symbol used for currency in the current C locale (public member object)
  • char frac_digits β€” the number of digits after the decimal point to display in a monetary quantity (public member object)
  • char p_cs_precedes β€” 1 if currency_symbol is placed before non-negative value, 0 if after (public member object)
  • char n_cs_precedes β€” 1 if currency_symbol is placed before negative value, 0 if after (public member object)
  • char p_sep_by_space β€” indicates the separation of currency_symbol, positive_sign, and the non-negative monetary value (public member object)
  • char n_sep_by_space β€” indicates the separation of currency_symbol, negative_sign, and the negative monetary value (public member object)
  • char p_sign_posn β€” indicates the position of positive_sign in a non-negative monetary value (public member object)
  • char n_sign_posn β€” indicates the position of negative_sign in a negative monetary value (public member object)

🌈 International monetary numeric formatting parameters

  • char* int_curr_symbol β€” the string used as international currency name in the current C locale (public member object)
  • char int_frac_digits β€” the number of digits after the decimal point to display in an international monetary quantity (public member object)
  • char int_p_cs_precedes (C++11) β€” 1 if int_curr_symbol is placed before non-negative international monetary value, 0 if after (public member object)
  • char int_n_cs_precedes (C++11) β€” 1 if int_curr_symboll is placed before negative international monetary value, 0 if after (public member object)
  • char int_p_sep_by_space (C++11) β€” indicates the separation of int_curr_symbol, positive_sign, and the non-negative international monetary value (public member object)
  • char int_n_sep_by_space (C++11) β€” indicates the separation of int_curr_symbol, negative_sign, and the negative international monetary value (public member object)
  • char int_p_sign_posn (C++11) β€” indicates the position of positive_sign in a non-negative international monetary value (public member object)
  • char int_n_sign_posn (C++11) β€” indicates the position of negative_sign in a negative international monetary value (public member object)
Not me pointing out that int_curr_symboll up there really does have an extra l in the original. That's how it's written, bestie, I don't make the rules. 🫢

πŸ¦‹ how do grouping and mon_grouping actually work

So the characters of the C-strings pointed to by grouping and mon_grouping are interpreted according to their numeric values. Read the characters as numbers, not as letters, iykyk.

When the terminating '\0' is encountered, the last value seen is assumed to repeat for the remainder of digits.

If CHAR_MAX is encountered, no further digits are grouped.

And the typical grouping of three digits at a time is "\003". Cute, right? Told you. ✨

🧁 how *_sep_by_space is interpreted

The values of p_sep_by_space, n_sep_by_space, int_p_sep_by_space, int_n_sep_by_space are interpreted as follows:

  1. 0 β€” no space separates the currency symbol and the value
  2. 1 β€” sign sticks to the currency symbol, value is separated by a space
  3. 2 β€” sign sticks to the value. Currency symbol is separated by a space

πŸŽ€ how *_sign_posn is interpreted

The values of p_sign_posn, n_sign_posn, int_p_sign_posn, int_n_sign_posn are interpreted as follows:

  1. 0 β€” parentheses around the value and the currency symbol are used to represent the sign
  2. 1 β€” sign before the value and the currency symbol
  3. 2 β€” sign after the value and the currency symbol
  4. 3 β€” sign before the currency symbol
  5. 4 β€” sign after the currency symbol

πŸ”₯ EXAMPLE πŸ”₯

// Run this code

#include <clocale>
#include <iostream>

int main()
{
    std::setlocale(LC_ALL, "ja_JP.UTF-8");
    std::lconv* lc = std::localeconv();
    std::cout << "Japanese currency symbol: " << lc->currency_symbol
              << '(' << lc->int_curr_symbol << ")\n";
}

⭐ Output

Japanese currency symbol: οΏ₯(JPY )

Look at that output. It ate. πŸ’…


πŸ¦‹ SEE ALSO πŸ¦‹

  • localeconv β€” queries numeric and monetary formatting details of the current locale (function)
  • numpunct β€” defines numeric punctuation rules (class template)
  • moneypunct β€” defines monetary formatting parameters used by std::money_get and std::money_put (class template)
  • C documentation for lconv

Okay that's the whole page, you're welcome, go format some money correctly. πŸŽ€ This masterpiece was served to you fresh from cppreference.com, dated 2024.06.10, and it goes by std::lconv(3). Mwah. πŸ’–

πŸ“¦ where this page comes from