---
name: "localeconv"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/localeconv"
---

# localeconv(3)

natural language formatting for C

## NAME

**localeconv** – natural language formatting for C

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<locale.h\>**

*struct* *lconv* *\**\

**localeconv**(*void*);

**#include \<xlocale.h\>**

*struct* *lconv* *\**\

**localeconv\_l**(*locale\_t locale*);

## DESCRIPTION

The **localeconv**() function returns a pointer to a structure which provides parameters for formatting numbers, especially currency values:

```
struct lconv {
	char	*decimal_point;
	char	*thousands_sep;
	char	*grouping;
	char	*int_curr_symbol;
	char	*currency_symbol;
	char	*mon_decimal_point;
	char	*mon_thousands_sep;
	char	*mon_grouping;
	char	*positive_sign;
	char	*negative_sign;
	char	int_frac_digits;
	char	frac_digits;
	char	p_cs_precedes;
	char	p_sep_by_space;
	char	n_cs_precedes;
	char	n_sep_by_space;
	char	p_sign_posn;
	char	n_sign_posn;
	char	int_p_cs_precedes;
	char	int_n_cs_precedes;
	char	int_p_sep_by_space;
	char	int_n_sep_by_space;
	char	int_p_sign_posn;
	char	int_n_sign_posn;
};
```

The individual fields have the following meanings:

- *decimal\_point*

  The decimal point character, except for currency values, cannot be an empty string.

- *thousands\_sep*

  The separator between groups of digits before the decimal point, except for currency values.

- *grouping*

  The sizes of the groups of digits, except for currency values. This is a pointer to a vector of integers, each of size *char*, representing group size from low order digit groups to high order (right to left). The list may be terminated with 0 or CHAR\_MAX. If the list is terminated with 0, the last group size before the 0 is repeated to account for all the digits. If the list is terminated with CHAR\_MAX, no more grouping is performed.

- *int\_curr\_symbol*

  The standardized international currency symbol.

- *currency\_symbol*

  The local currency symbol.

- *mon\_decimal\_point*

  The decimal point character for currency values.

- *mon\_thousands\_sep*

  The separator for digit groups in currency values.

- *mon\_grouping*

  Like *grouping* but for currency values.

- *positive\_sign*

  The character used to denote nonnegative currency values, usually the empty string.

- *negative\_sign*

  The character used to denote negative currency values, usually a minus sign.

- *int\_frac\_digits*

  The number of digits after the decimal point in an international-style currency value.

- *frac\_digits*

  The number of digits after the decimal point in the local style for currency values.

- *p\_cs\_precedes*

  1 if the currency symbol precedes the currency value for nonnegative values, 0 if it follows.

- *p\_sep\_by\_space*

  1 if a space is inserted between the currency symbol and the currency value for nonnegative values, 0 otherwise.

- *n\_cs\_precedes*

  Like *p\_cs\_precedes* but for negative values.

- *n\_sep\_by\_space*

  Like *p\_sep\_by\_space* but for negative values.

- *p\_sign\_posn*

  The location of the *positive\_sign* with respect to a nonnegative quantity and the *currency\_symbol*, coded as follows:

  - 0

    Parentheses around the entire string.

  - 1

    Before the string.

  - 2

    After the string.

  - 3

    Just before *currency\_symbol*.

  - 4

    Just after *currency\_symbol*.

- *n\_sign\_posn*

  Like *p\_sign\_posn* but for negative currency values.

- *int\_p\_cs\_precedes*

  Same as *p\_cs\_precedes*, but for internationally formatted monetary quantities.

- *int\_n\_cs\_precedes*

  Same as *n\_cs\_precedes*, but for internationally formatted monetary quantities.

- *int\_p\_sep\_by\_space*

  Same as *p\_sep\_by\_space*, but for internationally formatted monetary quantities.

- *int\_n\_sep\_by\_space*

  Same as *n\_sep\_by\_space*, but for internationally formatted monetary quantities.

- *int\_p\_sign\_posn*

  Same as *p\_sign\_posn*, but for internationally formatted monetary quantities.

- *int\_n\_sign\_posn*

  Same as *n\_sign\_posn*, but for internationally formatted monetary quantities.

Unless mentioned above, an empty string as a value for a field indicates a zero length result or a value that is not in the current locale. A CHAR\_MAX result similarly denotes an unavailable value.

The **localeconv\_l**() function takes an explicit locale parameter. For more information, see [xlocale(3)](/xlocale/3.md).

## RETURN VALUES

The **localeconv**() function returns a pointer to a static object which may be altered by later calls to [setlocale(3)](/setlocale/3.md) or **localeconv**(). The return value for **localeconv\_l**() is stored with the locale. It will remain valid until a subsequent call to [freelocale(3)](/freelocale/3.md). If a thread-local locale is in effect then the return value from **localeconv**() will remain valid until the locale is destroyed.

## ERRORS

No errors are defined.

## SEE ALSO

[setlocale(3)](/setlocale/3.md), [strfmon(3)](/strfmon/3.md)

## STANDARDS

The **localeconv**() function conforms to ISO/IEC 9899:1999 (“ISO C99”).

## HISTORY

The **localeconv**() function first appeared in 4.4BSD.
