sig
  type category =
      LC_ALL
    | LC_COLLATE
    | LC_CTYPE
    | LC_MESSAGES
    | LC_MONETARY
    | LC_NUMERIC
    | LC_TIME
  and numeric_lconv = {
    decimal_point : string;
    thousands_sep : string;
    grouping : string;
  } 
  and sign_pos =
      SurroundBoth
    | SignPrecedesBoth
    | SignSucceedsBoth
    | SignPrecedsCS
    | SignSucceedsCS
    | UnknownOrder
  and monetary_lconv = {
    int_curr_symbol : string;
    currency_symbol : string;
    decimal_point : string;
    thousands_sep : string;
    grouping : string;
    positive_sign : string;
    negative_sign : string;
    int_frac_digits : int;
    frac_digits : int;
    p_cs_precedes : bool;
    p_sep_by_space : bool;
    n_cs_precedes : bool;
    n_sep_by_space : bool;
    p_sign_posn : Locale.sign_pos;
    n_sign_posn : Locale.sign_pos;
  } 
  external set : ?name:string -> Locale.category -> string option
    = "stew_set_locale"
  val set_from_env : Locale.category -> string option
  val get : Locale.category -> string
  external numeric_info : unit -> Locale.numeric_lconv = "stew_localeconv_n"
  external monetary_info : unit -> Locale.monetary_lconv
    = "stew_localeconv_m"
end